我有以下代码:
function doSomething()
{
try {
doSomeNastyStuff() // throws Exception
} catch(\Exception $e) {
if ($this->errorHandler) {
call_user_func($e);
} else {
throw($e);
}
}
}
但是,catch block 不起作用。堆栈跟踪显示错误发生在 doSomeNastyStuff()
行。问题出在哪里?
最佳答案
问题是,您正在重新抛出异常。堆栈跟踪是 Exception
实例的一部分,并在创建异常时记录。您可以通过以下方式获取堆栈跟踪
$e->getTrace(); // Exception $e
当你在你的代码中重新抛出异常时,它仍然记录了旧的堆栈跟踪,这会欺骗你的框架向你展示,异常实际上发生在 doSomeNastyStuff()
行并且看起来像catch
不起作用。
因此,最好通过以下方式重新抛出异常:
/** instead of throw($e) do */
throw new \Exception("Unhandled exception", 1, $e);
从 php5.3 开始,Exception constructor
有可选的第三个参数 $previous
正是为了这个目的。然后,您可以使用 $e->getPrevious();
Exception
关于php - 我无法在 php 代码中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11683875/