在我的MVC路由器中,我得到了类似的内容:
if (class_exists('Controller')) {
$controller = new Controller();
} else {
throw new Exception('Controller not found.');
}
我实际上从来没有捕获过这种异常。我只是在那里,所以它显示我的错误,所以我可以查找并修复它。
我觉得这是一种使用异常的坏方法,不是吗?
如果是这样,那么使用例外的更好的例子是什么?
答案 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
更好的解决方案是将例外记录到文件和/或通知管理员。