3

我有以下代码:

function doSomething()
{
     try {
         doSomeNastyStuff() // throws Exception
     } catch(\Exception $e) {
         if ($this->errorHandler) {
             call_user_func($e);
         } else {
             throw($e);
         }
     }
}

但是,catch 块不起作用。堆栈跟踪向我显示了该行发生的错误doSomeNastyStuff()。哪里有问题?

4

1 回答 1

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();

于 2012-07-27T08:08:24.940 回答