在PHP5上,定义set_exception_handler()
和set_error_handler()
非常有意义。
但是,在PHP7上,所有(大多数?)错误现在都是异常。那么,定义两个处理程序有什么意义呢,即使错误会通过异常处理程序传递?
我看到在异常处理程序doc中有一个关于PHP7新Error
类的注释,但是在错误处理函数中没有引用不存在普通错误的事实,而是Throwable
s。
从PHP 7开始,大多数错误都是通过抛出
Error
异常来报告的,这些异常也会被处理程序捕获。Error
和Exception
都实现了Throwable
接口。 [source]
答案 0 :(得分:5)
Aaron Piotrowski(制作新的Error-Exception系统的人)有一个great blog on this。我认为你需要理解的关键点是
在PHP 7中,当发生致命和可恢复的错误(
E_ERROR
和E_RECOVERABLE_ERROR
)而不是暂停脚本执行时,将抛出异常。某些条件仍然存在致命错误,例如内存不足,并且仍然像以前一样通过立即停止脚本执行来执行操作。未捕获的异常也将继续是PHP 7中的致命错误。这意味着如果从PHP 5.x中的致命错误抛出的异常未被捕获,则在PHP 7中它仍然是致命错误。请注意,其他类型的错误(如警告和通知)在PHP 7中保持不变。只有致命和可恢复的错误才会引发异常。
以不同的方式考虑这个
set_exception_handler()
- 默认处理Exception
的函数(从PHP 7.0起,它可以处理所有Throwable
,因此可以捕获可恢复的错误)set_error_handler()
- 处理可恢复错误的函数换句话说,他们的功能并没有改变。在PHP5中触发它们的任何东西都会在PHP7中触发它们,现在,您可以在脚本级别使用try-catch
块来处理特定错误。
答案 1 :(得分:2)
http://php.net/manual/en/language.errors.php7.php对此非常了解:
PHP 7改变了PHP报告大多数错误的方式。不是通过PHP 5使用的传统错误报告机制报告错误,而是通过抛出错误异常来报告大多数错误。
与普通异常一样,这些错误异常会在到达第一个匹配的catch块之前冒泡。如果没有匹配的块,则将调用与set_exception_handler()一起安装的任何默认异常处理程序,如果没有默认的异常处理程序,则异常将转换为致命错误,并将像传统错误一样处理。 / p>
这意味着错误在技术上不是异常,但是它们可以像异常一样被捕获(这是一个很好的特性)。
例如,以下内容应与以前一样:
set_error_handler('handleError');
try {
// raise error
} catch (Exception $e) {
// won't catch error
}
然而,以下也应该是可能的
try {
// raise error
} catch (Exception $e) {
// won't catch error
} catch (Error $e) {
handleError();
}
答案 2 :(得分:0)
您可以使用 php trigger_error('test error')
看看当错误没有被 php set_exception_handler()