如何捕获require errors + error_handlers

时间:2014-12-16 17:00:58

标签: php exception error-handling

我正在尝试使用set_error_handler函数来捕获require错误 当我的自定义error_handler被使用时,上下文似乎完全关闭,尽管跟踪是正确的。

<?php
function error_handler($errno, $errstr, $errfile, $errline){
    throw new Exception($errstr);
}

set_error_handler('error_handler');


try{
    trigger_error("somethign",E_USER_NOTICE);
}catch(Exception $e){
    echo "I got caught";
}


try{
    require "something/that/does/not/exists.php";
}catch(Exception $e){
    echo "I got caught";
}

可以看出,当我触发第一个错误时,它会触发error_handler,而error_handler又会引发异常。这是第一次尝试捕获。

第二次,我尝试包含一个未存在的文件,再次使用{{1}},但没有捕获到异常。
这是怎么回事?

我使用的是PHP 5.5。*
在CLI模式下测试。

2 个答案:

答案 0 :(得分:1)

请阅读文档:

  

要求与包含相同,除非失败时也是如此   产生致命的E_COMPILE_ERROR级别错误。换句话说,它会   暂停脚本

http://php.net/manual/en/function.require.php

这意味着,遇到此错误时将中止脚本执行。将使用您的自定义错误处理程序,但throw将被忽略,因为这假设此时不允许进一步执行。

答案 1 :(得分:0)

重要的是要记住PHP有两种常见的错误类型

  • 程序运行时会捕获处理错误
  • 当您的语法错误或尝试做不可能的事情时会发生编译错误

在您的情况下,require是编译错误。它不会执行您的用户定义函数,因为它永远不会那么远。编译器不能包含坏文件并将失败。