现在所有错误都是例外,PHP7上的set_error_handler()会发生什么?

时间:2016-11-01 13:45:46

标签: php error-handling exception-handling php-7

在PHP5上,定义set_exception_handler()set_error_handler()非常有意义。

但是,在PHP7上,所有(大多数?)错误现在都是异常。那么,定义两个处理程序有什么意义呢,即使错误会通过异常处理程序传递?

我看到在异常处理程序doc中有一个关于PHP7新Error类的注释,但是在错误处理函数中没有引用不存在普通错误的事实,而是Throwable s。

  

从PHP 7开始,大多数错误都是通过抛出Error异常来报告的,这些异常也会被处理程序捕获。 ErrorException都实现了Throwable接口。 [source]

3 个答案:

答案 0 :(得分:5)

Aaron Piotrowski(制作新的Error-Exception系统的人)有一个great blog on this。我认为你需要理解的关键点是

  

在PHP 7中,当发生致命和可恢复的错误(E_ERRORE_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()

处理时会发生什么