我有以下代码:
function doSomething()
{
try {
doSomeNastyStuff() // throws Exception
} catch(\Exception $e) {
if ($this->errorHandler) {
call_user_func($e);
} else {
throw($e);
}
}
}
但是,catch块不起作用。堆栈跟踪向我显示行doSomeNastyStuff()
处发生的错误。问题在哪里?
答案 0 :(得分:5)
问题是,你正在重新抛出你的异常。堆栈跟踪是Exception
实例的一部分,此时会记录,创建异常。您可以通过
$e->getTrace(); // Exception $e
当你在代码中重新抛出异常时,它仍然记录了旧的堆栈跟踪,这会欺骗你的框架向你显示,异常实际发生在doSomeNastyStuff()
行,它似乎是catch
不起作用。
因此,最好以下列方式重新抛出异常:
/** instead of throw($e) do */
throw new \Exception("Unhandled exception", 1, $e);
从php5.3开始,Exception constructor
完全具有可选的第三个参数$previous
。然后,您可以使用Exception
$e->getPrevious();