1>先去看PHP手册,怎么定义异常和错误的!
http://php.net/manual/zh/index.php
语言参考:
1)Errors
basics
1.PHP错误报告,反应的是程序内部的不同错误情况。有许多不同的错误情况,这些错误可以展示或者记录到日志里。
PHP产生的每个错误,都包含一个类型。可用的错误类型有:
预定义的常量,作为PHP核心的一部分。
注意:
在 php.ini 里,可以使用 '常量名';但在PHP之外,例如:httpd.conf,必须使用 '二进制位掩码'(是不是 常量的值 ??) 来替代
1 - E_ERROR
2 - E_WARNING
4 - E_PARSE
8 - E_NOTICE
16 - E_CORE_ERROR
32 - E_CORE_WARNING
64 - E_COMPILE_ERROR
128 - E_COMPILE_WARNING
256 - E_USER_ERROR
512 - E_USER_WARNING
1024 - E_USER_NOTICE
2048 - E_STRICT
4096 - E_RECOVERABLE_ERROR
8192 - E_DEPRECATED
16384 - E_USER_DEPRECATED
30719 - E_ALL
上面的值,用于建立一个 '二进制位掩码',来指定要报告的错误信息。
可以使用 '按位运算符' 来 '组合' 或 '屏蔽' 这些值,来表示是展示还是屏蔽某些错误!
php.ini 中,只有 '|', '~', '^', '&' 会正确解析
/*
注意:
以前一直都没细看过,现在才明白,php手册中的错误配置,为什么要使用 '位运算符',这里都解释了!
*/
2.handling errors with PHP
如果没有设置错误处理器,PHP将会根据它的配置,来处理错误:
error_reporting // 或者运行时,使用 error_reporting()。
1>建议配置中设置,因为,有些错误,可能是脚本执行前就发生了。
2>开发环境中,应该将 error_reporting 设置为 'E_ALL'
生产环境中,可能希望展示较少的错误,例如:E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
但是建议都使用 E_ALL,早期就提示警告,或许可以避免后期潜在的大的问题
display_errors // 控制的是错误的输出
1>开发环境,开启,便于调试
生产环境,关闭,可能包含数据等私密信息
log_errors // 除了可以输出错误,PHP可以将错误记录到日志中。
1>生产环境,开启以记录错误!
2>错误日志文件,通过 'error_log' 来配置
3.user error handlers
PHP默认的错误处理不满足我们的要求,我们可以自定义错误处理,通过 set_error_handlers()。
PHP7错误处理
1.不同于PHP5的错误报告机制,PHP7的大多数错误,作为 'Error异常' 抛出
'Error异常' 可以像 'Exception异常' 一样,被 try/catch 来捕获。如果没有匹配的 catch,则调用 '异常处理函数'(set_exception_handler()注册) 进行处理。如果没有注册异常处理函数,则按照传统方式处理:PHP错误报告一个 '致命错误'(Fatal Error)
/*
解释下错误异常顺序:
1.try / catch
2.set_exception_handler() // 注意:不是上面basic的 'set_error_handler()'
3.PHP 错误报告
*/
Error类,并非继承 'Exception',不能使用 'catch(Exception $e)',而应该使用 'catch(Error $e)'。或者,通过 'set_exception_handler()' 来捕获 Error
2.Error的层次结构
Throwable
Error
ArithmeticError
DivisionByZeroError
AssertionError
ParseError
TypeError
Exception
/*
可以看到:
'Error' 和 'Exception',都继承 'Throwable'
*/
3.手册上,有人推荐了一篇文章,该文章介绍了 exceptions, throwables的区别,以及PHP7如何处理的。
/*
有时间看,看了2句,感觉确实很不错!
*/
4.兼容PHP5.x和PHP7.x的异常和错误捕获
try {
} catch (Exception $e) { // PHP5.x执行
} catch (Throwable $e) { // PHP7.x执行
}
2)异常处理
1.扩展PHP内置的异常处理类
2.讲述了捕获异常的结构
try {
} catch (Exception $e) { // PHP5.x执行
} catch (Throwable $e) { // PHP7.x执行
} finally { // 不管有没有捕获到异常,都会执行!PHP5.5+
}
catch 允许多个
/*
切记:
当代码块中,有异常抛出,但并未被catch捕获,会转变为一个 'Fatal Error',并显示 'Uncaught Exception'
除非,定义过 'set_exception_handler()'
------
这也是我们上面提到的异常处理的顺序
*/
注释:
PHP内部函数,主要使用 'Error Reporting';仅有面向对象扩展,使用 '异常'。然后,通过 'ErrorException',错误可以很简单的被转换为异常!(不太懂。。。)
3.手册上的评论,2个例子不错:
1>当使用了 namespace(命名空间),一定不要忘记 '\' 反斜线,表示 '全局范围'(这也正是我开头犯得错误!)
<?php
namespace test;
class Test {
function test(){
try {
throw new \Exception('异常'); // 添加 '\'
} catch (\Exception $e) { // 添加 '\'
var_dump($e->getMessage());
}
}
}
2>关于try / catch /finally 里的 return
<?php
namespace test;
class Test {
public function test1()
{
$bar = 1;
try{
throw new \Exception('I am Wu Xiancheng.');
}catch(\Exception $e){
return $bar;
$bar--; // this line will be ignored
}finally{
$bar++;
return $bar;
}
}
public function test2()
{
$bar = 1;
try{
throw new \Exception('I am Wu Xiancheng.');
}catch(\Exception $e){
return $bar;
$bar--; // this line will be ignored
}finally{
$bar++;
}
}
public function dd()
{
echo $this->test1(); // 输出2。finally有return,try/catch返回的是finally里return的值
echo $this->test2(); // 输出1。finally没有return,返回的是 catch里return的值
}
}
3>预定义异常
Exception // 所有异常的基类
ErrorException // 错误异常,ErrorException extends Exception
4>SPL异常处理
LogicException
BadFunctionCallException
BadMethodCallException
DomainException
InvalidArgumentException
LengthException
OutOfRangeException
RuntimeException
OutOfBoundsException
OverflowException
RangeException
UnderflowException
UnexpectedValueException
异常和错误的几个相关函数:
set_error_handler()
set_exception_handler()
restore_error_handler() // 恢复之前定义过的错误处理函数(上一个错误处理函数)
restore_exception_handler() // 恢复之前定义过的异常处理函数(上一个异常处理函数)
PHP的错误和异常笔记
最新推荐文章于 2025-05-08 18:49:05 发布