标签:
在编写php程序时,错误处理是一个重要的部分。如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE |
Run-time 通知。 脚本发现可能有错误发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL |
所有错误和警告,除级别 E_STRICT 以外。 (在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)
|
需求:比如要接收一个年龄,如果数字大于120,就认为是一个错误传统方法:
if($age>120){
echo ‘年龄错误‘;exit();
}
1 <?php
2 date_default_timezone_set(‘PRC‘);
3 function myerror($error_level,$error_message){
4 $info= "错误号:$error_level\n";
5 $info.= "错误信息:$error_message\n";
6 $info.= ‘发生时间:‘.date(‘Y-m-d H:i:s‘);
7 $filename=‘aa.txt‘;
8 if(!$fp=fopen($filename,‘a‘)){
9 ‘创建文件‘.$filename.‘失败‘;
10 }
11 if(is_writeable($filename)){
12 if(!fwrite($fp,$info)){
13 echo ‘写入文件失败‘;
14 } else {
15 echo ‘已成功记录错误信息‘;
16 }
17 fclose($fp);
18 } else {
19 echo ‘文件‘.$filename.‘不可写‘;
20 }
21 exit();
22 }
23 set_error_handler(‘myerror‘,E_WARNING);
24 $fp=fopen(‘aaa.txt‘,‘r‘);
25 ?>
让我们触发一个异常:
1 <?php
2 //创建可抛出一个异常的函数
3 function checkNum($number){
4 if($number>1){
5 throw new Exception("Value must be 1 or below");
6 }
7 return true;
8 }
9
10 //在 "try" 代码块中触发异常
11 try{
12 checkNum(2);
13 //如果异常被抛出,那么下面一行代码将不会被输出
14 echo ‘If you see this, the number is 1 or below‘;
15 }catch(Exception $e){
16 //捕获异常
17 echo ‘Message: ‘ .$e->getMessage();
18 }
19 ?>
上面代码将获得类似这样一个错误:
Message: Value must be 1 or below
上面的代码抛出了一个异常,并捕获了它:
不过,为了遵循“每个 throw 必须对应一个 catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。
set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数
//设置一个顶级异常处理器
function myexception($e){
echo ‘this is top exception‘;
} //修改默认的异常处理器
set_exception_handler("myexception");
try{
$i=5;
if($i<10){
throw new exception(‘$i must greater than 10‘);
}
}catch(Exception $e){
//处理异常
echo $e->getMessage().‘<br/>‘;
//不处理异常,继续抛出
throw new exception(‘errorinfo‘); //也可以用throw $e 保留原错误信息;
}
创建一个自定义的异常类
class customException extends Exception{
public function errorMessage(){
//error message $errorMsg = ‘Error on line ‘.$this->getLine().‘ in ‘.$this->getFile().‘: <b>‘.$this->getMessage().‘</b> is not a valid E-Mail address‘; return $errorMsg;
}
}
//使用
try{
throw new customException(‘error message‘);
}catch(customException $e){
echo $e->errorMsg();
}
可以使用多个catch来返回不同情况下的错误信息
try{
$i=5;
if($i>0){
throw new customException(‘error message‘);//使用自定义异常类处理
} if($i<-10){
throw new exception(‘error2‘);//使用系统默认异常处理
}
}catch(customException $e){
echo $e->getMessage();
}catch(Exception $e1){
echo $e1->getMessage();
}
简而言之:如果抛出了异常,就必须捕获它。
标签:
原文地址:http://www.cnblogs.com/shsgl/p/4305718.html