class ErrorController extends ControllerAbstract {
...
public static function createErrorException($number, $message = NULL, $file = NULL, $line = NULL, array $context = array()) {
throw new ErrorException($message, $number, 0, $file, $line);
}
}
使用 set_error_handler()
注册错误处理程序。这个方法很好用,但是遇到致命错误时(不是故意的),无法捕获抛出的 ErrorException
异常。
比如尝试包含一个不存在的文件:
try {
require 'Controller/NonExistentController.php';
} catch (ErrorException $exc) {
echo $exc->getTraceAsString(); // code never reaches this block
}
我的自定义错误处理程序被调用并抛出了异常,但代码从未到达“catch”块。相反,PHP会生成HTML(不好!):
随后是:
警告:Uncaught exception 'ErrorException' with message 'require(Controller/NonExistentController.php): failed to open stream: ...
我不想尝试从致命错误中恢复,但我希望我的代码能够优雅地退出。在这种情况下,这意味着发送一个XML或JSON响应,指示内部错误,因为这是一个REST应用程序,我的客户端期望如此。 HTML响应很可能也会破坏客户端应用程序。致命错误:Program::main():打开所需的“Controller/NonExistentController.php”失败(include_path ='.:')...
我应该以不同的方式处理吗?
@
运算符来隐藏这些烦人的消息之外,没有其他方法,但正如@Alec Teal所说,如果scream.enabled
被设置,你无能为力,但通常情况下它是禁用的。 - Henrique Barcelos