2010-05-25 40 views
7

默認Xdebug的將轉儲任何異常,無論它是否被卡住或不:禁用Xdebug的的傾銷捕獲的異常

try { 
    throw new Exception(); 
} 
catch (Exception $e) { 
} 
echo 'life goes on'; 

隨着XDebug的啓用,默認設置這段代碼實際上將輸出類似下面的(很好地格式化):

(!) Exception: in /test.php on line 3 Call Stack 
# Time Memory Function Location 1 0.0003 52596 {main}() ../test.php:0 
life goes on 

是否可以禁用此行爲並使其僅轉儲未捕獲的異常?

在此先感謝。

更新:我即將結束,這是一個錯誤,因爲xdebug.show_exception_trace默認情況下禁用尚未如預期(在Ubuntu 9.10使用Xdebug的V2.0.5與PHP 5.2.10它不表現)。

回答

9

更改xdebug.show_exception_trace選項(注意它沒有默認啓用)。

xdebug.show_exception_trace

類型:整數,默認值:0

當該設置被設置爲1,Xdebug的將顯示每當產生一個異常堆棧跟蹤 - 即使該例外是實際上發現了

+0

我同意這與xdebug.show_exception_trace有關。我認爲,如果設置爲0,它應該忽略捕獲的異常,但即使明確禁用它,也不行。 – nuqqsa 2010-05-25 12:06:28

+0

在#php.pecl @ EFNet上與Derick交談,或者使用http://bugs.xdebug.org/ – Artefacto 2010-05-25 12:48:57

+0

上的錯誤跟蹤器。這最後一條評論讓你的答案完整:)我絕對會報告這個錯誤,以防我可以仍然在2.1.0RCx中重現它。謝謝。 – nuqqsa 2010-05-28 11:36:58

1

如果您的代碼命名空間,catch塊應參考\Exception - 用反斜槓 - 如果沒有反斜線那麼PHP將尋找Exception在當前的命名空間。這通常會失敗,未捕獲的異常將傳遞給Xdebug。

下面的代碼將異常的Xdebug:

namespace foo; 

try { 
    new \PDO(0); 
} catch (\Exception $e) { 
    echo "Caught!"; 
} 
// Exception caught correctly 

手動拋出異常可能是:

namespace foo; 

try { 
    new \PDO(0); 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Uncaught exception... 

添加一個反斜槓異常會尋找(並找到)Exception在全局命名空間之前混亂(這就是爲什麼我使用上面的PDO)。如果我們試圖從當前的命名空間拋出一個異常,PHP告訴我們異常不存在有:

namespace foo; 

try { 
    throw new Exception(); 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Class 'foo\Exception' not found 

拋出一個全局異常,而不在catch塊一個全球性的參考文獻沒有不同:

namespace foo; 

try { 
    throw new \Exception(); // global Exception 
} catch (Exception $e) { 
    echo "Caught!"; 
} 
// Fatal error: Uncaught exception 'Exception' in... 

鑑於所有這些,總是在catch的Exception前加反斜槓是個好主意。

namespace foo; 

try { 
    throw new \Exception(); 
} catch (\Exception $e) { 
    echo "Caught!"; 
} 
// Exception caught correctly