我试图使用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,但是没有捕获异常。
这里发生什么事情?
我使用的是php 5.5.*
在CLI模式下测试。
发布于 2014-12-16 17:05:24
只需阅读文档:
require与include相同,除非失败,否则还会产生致命的E_COMPILE_ERROR级别错误。换句话说,它将停止脚本。
(http://php.net/manual/en/function.require.php)
这意味着,当遇到此错误时,脚本执行将被中止。您的自定义错误处理程序将被使用,但throw将被忽略,因为这假设进一步执行,此时不允许执行。
发布于 2014-12-16 17:07:21
重要的是要记住,PHP有两种常见的错误类型
在您的示例中,require是一个编译错误。它不会执行您的用户定义的函数,因为它永远不会走那么远。编译器不能包含坏文件并将失败。
https://stackoverflow.com/questions/27509952
复制相似问题