1、错误处理
a、关于php中错误处理的一些常量
值 | 常量 | 解释 |
1 | E_ERROR | 解析时致命错误 fatal |
4 | E_PARSE | 解析时语法错误 parse |
2 | E_WARNING | 警告 warning |
8 | E_NOTICE | 提示 notice |
256 | E_USER_ERROR | 用户级别的错误 |
512 | E_USER_WARNING | 用户级别的错误 |
1024 | E_USER_NOTICE | 用户级别的错误 |
16 | E_CORE_ERROR | php内核错误 由PHP引擎产生 |
32 | E_CORE_WARNING | php内核警告 由PHP引擎产生 |
64 | E_COMPIILE_ERROR | php编译错误 Zend引擎产生 |
128 | E_COMPIILE_WARNING | php编译警告 Zend引擎产生 |
2048 | E_STRICT | 显示PHP对代码的修改建议 |
8196 | E_ALL | 显示所有错误 |
4096 | E_RECOVERABLE_ERROR | 可以被用户函数捕获的致命(E_ERROR)错误 |
解释错误级别的产生
E_ERROR fatal
运行时错误
e.g. 定义的函数不存在、重复定义函数
E_PARSE parse
解释时错误,导致php解析器无法读懂源码
e.g. 少写分号 、括号不匹配
E_WARNING warning
警告
代码可被解释但是可执行 执行是被忽略(代码不起作用)
e.g. $a='';
foreach($a as $b){}
foreach无法处理非array object 的变量
E_NOTICE notice
提示
常见于变量未定义、但是可以解释通过 可以执行
他们的优先级别 E_ERROR > E_PARSE > E_WARNING > E_NOTICE
b、用户自定义处理错误的机制(这个机制跟php的错误机制是独立的)
使用机制:
// 指定错误处理函数
set_error_handler('error_handler');
// 触发用户级别错误的函数
trigger_error($errmsg,$errno); // user_error() alias of trigger_error
//错误处理函数
function error_handler($no,$msg,$file,$line,$context)
{
/* $no 错误号
$msg 错误信息
$file 文件
$line 行号
$context 错误时全局数组*/
exit();
}
set_error_handler 设置捕获错误的函数
trigger_error($msg , $type) 触发错误
2、异常处理
异常的处理机制: 异常抛出 - 捕获处理 每一个抛出的异常都要被捕获
抛出异常的方法
throw new Exception("Exception Message", $code);
捕获异常的方法有两种
a、异常是在try中抛出的,那就必须在catch中捕获
e.g.
try{
// 抛出异常
throw new Exception("you should give string", 11);
}
catch(Exception $e){
print_r($e);
}
b、异常不在try中抛出,要用set_exception_handler指定捕获异常的函数
// 指定异常捕获函数
set_exception_handler('exception_handler');
// 抛出异常
throw new Exception("exception message no try", 1);
// 定义异常捕获函数
function exception_handler($e)
{
echo $e->getMessage();
}
注意:
错误导致脚本终止向下执行
异常并不会导致程序终止,程序会继续向下执行
3、其他
ErrorException 、 RuntimeException 都继承自 Exception
RuntimeException是运行时异常
ErrorException 重写了Exception的 构造函数,可以给class传递 错误信息(错误号,错误信息,错误文件,错误行,。。)
public ErrorException::__construct ([ string $message
= "" [, int $code
= 0 [, int $severity
= 1[, string $filename
= __FILE__ [, int $lineno
= __LINE__ [, Exception $previous
= NULL
]]]]]] )
参数 ¶
-
抛出的异常消息内容。
-
异常代码。
-
异常的严重级别。
-
抛出异常所在的文件名。
-
抛出异常所在的行号。
-
异常链中的前一个异常。
message
code
severity
filename
lineno
previous
set_error_handler('error_handler');
set_exception_handler('exception_handler')
trigger_error('error_msg',E_USER_NOTICE);
function error_handler($no,$msg,$file,$line,$context)
{
throw new ErrorException($msg, $no, 1, $file, $line);
}
function exception_handler($e)
{
// $e is ErrorException
}
trigger_error 抛出一个错误后,set_error_handler会把这个错误递交给 error_handler 函数处理
error_handler函数抛出异常 ErrorException
异常ErrorException被 set_exception_handler 指定的异常捕获函数 exception_handler 捕获,此时在 exception_handler 函数中的参数 $e 就是ErrorException
以此达到 抛出错误 错误被当作异常进行处理 的目标
4、错误与异常的区别
错误是 不该出现的信息 编码的时候避免出现的
异常是 业务逻辑 编码的时候设计的
其他解释:
error
绝大多数的错误都是非正常的,就根本不该出现的。合理的应用程序不应该去try/catch这种错误
exception:
它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它