仅限 PHP5(仅在 php5.0 中测试过)。
如果您出于某种原因更喜欢异常而不是错误,并且您的自定义错误处理程序(set_error_handler)将错误包装到异常中,则必须小心使用您的脚本。
因为如果您不是只调用异常处理程序,而是抛出异常,并且有一个自定义异常处理程序(set_exception_handler)。如果在该异常处理程序内部触发了错误,您将收到一个奇怪的错误
"致命错误:在 Unknown 的第 0 行抛出异常,但没有堆栈帧"
此错误的信息量并不大,是吗? :)
下面的示例将导致此错误。
<?php
class PHPErrorException extends Exception
{
private $context = null;
public function __construct
($code, $message, $file, $line, $context = null)
{
parent::__construct($message, $code);
$this->file = $file;
$this->line = $line;
$this->context = $context;
}
};
function error_handler($code, $message, $file, $line) {
throw new PHPErrorException($code, $message, $file, $line);
}
function exception_handler(Exception $e)
{
$errors = array(
E_USER_ERROR => "用户错误",
E_USER_WARNING => "用户警告",
E_USER_NOTICE => "用户通知",
);
echo $errors[$e->getCode()].': '.$e->getMessage().' in '.$e->getFile().
' on line '.$e->getLine()."\n";
echo $e->getTraceAsString();
}
set_error_handler('error_handler');
set_exception_handler('exception_handler');
throw new Exception('foo', 0);
?>
但是,对此有一个简单的解决方法,因为它仅仅是由糟糕的代码导致的。
例如,直接从 error_handler 调用 exception_handler 而不是抛出异常。这不仅可以解决此问题,而且速度更快。尽管这会导致打印“常规”未处理异常,并且如果只希望“设计”错误消息,这不是最终的解决方案。
那么,该怎么办?确保 exception_handlers 中的代码不会导致任何错误!在这种情况下,一个简单的 isset() 就可以解决问题。
此致,C-A B。