2012-07-27 32 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