仅限 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 => "User Error",
E_USER_WARNING => "User Warning",
E_USER_NOTICE => "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。