我在Ubuntu 12.10上运行PHP 5.4.12。
我正在使用错误处理程序将PHP错误转换为异常,以便我可以处理它们。但是,我发现虽然我可以将错误转化为异常,但似乎根本没有办法捕获异常。
以下是一些简单的演示代码:
<?php
class CErrorException extends Exception {}
function handleError($level, $message, $file, $line){
if( error_reporting() != 0){
throw new CErrorException($message, $level);
}
}
function handleException(Exception $exception){
var_dump('Exception handled at global level');
}
set_error_handler('handleError');
set_exception_handler('handleException');
try {
require_once('non\existent\file'); //Will generate an error and cause an exception to be thrown.
} catch (Exception $e) {
var_dump("let's deal with the exception");
}
不幸的是,在这种情况下,我永远无法捕获抛出的异常,这使得很难从在不存在或不可读的文件上使用require_once
引起的问题中恢复。
我收到了这两个错误:
Warning: Uncaught exception 'CErrorException' with message 'require_once(non\existent\file): failed to open stream: Invalid argument' in /work/test.php:7 Stack trace: #0 /work/test.php(20): handleError(2, 'require_once(no...', '/work/test.php', 20, Array) #1 /work/test.php(20): require_once() #2 {main} thrown in /work/test.php on line 7
Fatal error: main(): Failed opening required 'non\existent\file'
根本没有办法抓住它吗?
答案 0 :(得分:0)
并非所有错误都可以使用错误处理程序处理。 PHP核心中的致命错误将停止处理进一步的指令,包括处理错误处理程序。来自set_error_handler()的文档:
使用用户定义无法处理以下错误类型 功能:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING, E_COMPILE_ERROR,E_COMPILE_WARNING和大多数E_STRICT在 调用set_error_handler()的文件。