抛出异常而不抓坏它们?

时间:2014-05-20 21:38:00

标签: php exception error-handling

在我的MVC路由器中,我得到了类似的内容:

if (class_exists('Controller')) {
    $controller = new Controller();
} else {
    throw new Exception('Controller not found.');
}

我实际上从来没有捕获过这种异常。我只是在那里,所以它显示我的错误,所以我可以查找并修复它。

我觉得这是一种使用异常的坏方法,不是吗?

如果是这样,那么使用例外的更好的例子是什么?

2 个答案:

答案 0 :(得分:0)

不,这是使用它们的好方法。至少如果您遇到此错误,您将收到明确的错误消息。是否应该被捕获取决于具体情况。

据推测,在生产中你实际上并没有显示错误,但它仍然应该在错误日志中(同样取决于你正在使用的框架等)。

答案 1 :(得分:0)

允许异常未被捕获可能会导致一些混乱的情况。最糟糕的情况是异常可能导致堆栈跟踪输出到客户端,并且堆栈跟踪可能包含敏感信息。例如:

class Foo {
    public function __construct($username, $password) {
        throw new Exception('oh noes');
    }
}

$bar = new Foo('Sammitch', 'bologna123');

生成以下输出

PHP Fatal error:  Uncaught exception 'Exception' with message 'oh noes' in /home/sammitch/tmp/test.php:6
Stack trace:
#0 /home/sammitch/tmp/test.php(11): Foo->__construct('Sammitch', 'bologna123')
#1 {main}
  thrown in /home/sammitch/tmp/test.php on line 6

异常可能会在堆栈深处抛出更多级别,代码与需要这些凭据的代码完全无关。

在这种情况下的最佳做法是使用set_exception_handler()来定义一个函数,该函数将以您明确定义的方式处理未捕获的异常。例如:

set_exception_handler(function($e){ echo $e->getMessage(); });

这使得上面的示例输出简单:oh noes

更好的解决方案是将例外记录到文件和/或通知管理员。