2016-01-21 68 views
4

在C#,執行以下操作會破壞異常的堆棧跟蹤:在PHP中重新拋出異常是否破壞堆棧跟蹤?

try{ 
    throw new RuntimeException(); 
} 
catch(Exception e){ 
    //Log error 

    //Re-throw 
    throw e; 
} 

正因爲如此,使用throw而非throw e是優選的。這會讓相同的異常向上傳播,而不是將其包裝在一個新的異常中。

但是,使用throw;而未指定異常對象在PHP中是無效的語法。這個問題在PHP中不存在嗎?如下使用throw $ e不會破壞堆棧跟蹤?

<?php 

try{ 
    throw new RuntimeException(); 
} 
catch(Exception $e){ 
    //Log error 

    //Re-throw 
    throw $e; 
} 

回答

3

當你在PHP中拋出$ e時,就像你重新拋出現有的異常對象而不改變它的任何內容併發送所有給定的信息,包括捕獲異常的堆棧跟蹤。

如果你想給你扔你必須重新拋出一個新創建的異常對象的最後一條消息的新位置:

throw new RuntimeException($e->getMessage()); 
+1

爲什麼要拋出一個新的異常與舊的異常的消息,而不是再次拋出舊的異常?這種方法背後的邏輯是什麼?在這種情況下,你應該使用異常鏈接。 – Dragos

0

是的。這是捕獲異常並重新拋出攜帶堆棧跟蹤數據的同一異常對象的最佳方法。一旦你到達了處理請求的方法點,只需在那裏捕獲它並相應地發回響應給用戶。

它是一個壞主意,拋出一個新的異常對象,它會丟失堆棧跟蹤並創建一個導致內存負載的額外對象。

希望這會有所幫助。

0

重新拋出同樣的異常不會破壞堆棧跟蹤。 但根據你所需要的,對另一給出你可能只想拋出同樣的異常或建立一個異常鏈(見PHP文件>Exception::__construct

A的時候,爲什麼人會選擇一種方法很好的解釋在this answer