【发布时间】:2013-11-29 22:28:23
【问题描述】:
在我自制的 PHP MVC 框架中,我编写了一个小错误处理程序,它将 PHP 错误包装在异常中,然后将其抛出。
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(糟糕!):
警告:未捕获的异常“ErrorException”与 消息 'require(Controller/NonExistentController.php): 无法打开流:...
接着是:
致命错误:Program::main():需要打开失败 'Controller/NonExistentController.php' (include_path='.:') in ...
我不想尝试从致命错误中恢复,但我确实希望我的代码能够正常退出。在这种情况下,这意味着发回指示内部错误的 XML 或 JSON 响应,因为这是一个 REST 应用程序,而这正是我的客户所期望的。 HTML 响应也很可能会破坏客户端应用程序。
我应该采取不同的方式吗?
【问题讨论】:
-
哈哈,PHP错误处理,总是让我傻笑,“@,关于文件不存在的警告不会被打印出来。但是如果在php中设置了scream.enabled,它就会被打印出来。 “是的....
-
哦,我最喜欢的“可捕获的致命错误”
-
我承认我被 C# 中异常处理的简单程度所宠坏了,但在 PHP 中肯定不会那么困难吗?
-
PHP 有很多问题,== 运算符是错误的,strpos 返回 0,这可能是假的...阅读me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design 老实说,我认为这无法解决, A for努力,但是....值得一试吗?
-
我只是不喜欢 PHP 随时生成 HTML 输出。不过,我还没有研究如何配置 php.ini 文件。我以为世界已经从ini文件开始了。
标签: php error-handling fatal-error