2012-07-27 61 views
3

我有下面这段代码:我无法赶上例外PHP代码

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

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

回答

5

问题是,您正在重新抛出您的异常。堆栈跟踪是Exception实例的一部分,并在此刻记录,创建异常。您可以通过

$e->getTrace(); // Exception $e 

当你在你的代码重新抛出异常,它仍然有记录旧的堆栈跟踪获取堆栈跟踪,这技巧你的框架向您展示,除了实际发生在该行doSomeNastyStuff(),似乎像catch不起作用。

因此,更好的办法是重新抛出异常的方式如下:

/** instead of throw($e) do */ 
throw new \Exception("Unhandled exception", 1, $e); 

Beginining与PHP5.3,Exception constructor具有可选的第三个参数$previous正是为了这个目的。然后您可以使用$e->getPrevious();

以前的 Exception