2012-10-11 60 views
2

下面是一個很好的做法,如果不是應該做什麼?投擲一個新的例外最佳實踐

catch(Exception e) 
{ 
    throw new Exception(e.Message, e); 
} 
+1

真的模糊的問題。你想達到什麼目的?不知道,你不能有一個「最佳做法」。 –

+0

我已閱讀了一些遍佈此類異常處理的代碼。我相信這是不正確的,只是使用「扔」;是正確的。 –

+0

如果它只是catch(Exception e){拋出新Exception ...',那麼只需刪除try/catch。我以前見過這種模式,我不知道它來自哪裏;但是對於時間的調試來說卻是一件很糟糕的事情。只要刪除try/catch,如果catch只是拋出('throw;'或'throw new Exception ...') –

回答

17

不,這是不好的做法,如果你用相同的消息拋出另一個完全相同類型的異常。在這樣做的時候,你會使堆棧跟蹤變得複雜,並使調試變得更加痛苦。

如果你打算拋出一個新的異常,它應該與某些重要的方式有所不同。例如,它應該是另一種類型,或者以某種其他方式(如更具體的錯誤消息)闡明異常的原因。如果你不能做這兩件事情之一,那麼只需使用throw;重新拋出當前異常。

或者,甚至更好,根本不抓住它。反思實際上也會讓堆棧跟蹤變得微不足道(當前幀的錯誤位置被設置爲重新拋出點而不是發生異常的地點),所以如果你沒有任何事情需要你親自處理異常,然後轉手 - 讓它傳播並讓調用者處理它。

2

這取決於你正在嘗試做的。確切的代碼將是毫無意義的,但類似

catch(Exception ex) 
{ 
    throw new ApplicationSpecificException("Error while doing something specific: " + contextualData, ex); 
} 

將在調試時幫助很大。本身

catch(Exception e) 
{ 
    // Additional handling here 
    throw; 
} 

Throw只需重新引發當前異常:

+2

其實他的代碼不是*毫無意義*,它恰恰相反。它會將一個ApplicationSpecificException變成一個普通的「Exception」,這可能比只是無所事事更糟糕。 – Servy

+0

@Servy - 這仍然[毫無意義](http://www.thefreedictionary.com/pointless)。 –

1

如果您需要重新把它扔之前做的事例外,做到這一點。如果你不需要在這裏處理它,首先不要抓住它。

此外,在你的例子中,你正在捕捉任何類型的異常,但拋出一個通用的Exception - 可能不是很有用。

+0

重新推出一個以上的性能和數據丟失的缺點是什麼? –

+0

是的,數據丟失,特別是堆棧跟蹤。通過執行'throw e',你可以開始堆棧跟蹤。通過僅僅執行'throw',保留底層異常的堆棧跟蹤。 –

0

如果代碼真的只是:

try 
{ 
    // something 
} 
catch(Exception e) 
{ 
    throw new Exception(e.Message, e); 
} 

只是刪除try/catch語句,它沒有做任何富有成效。 throw new...交換throw;更好,但仍然沒有生產力。

,如果有別的東西在catch怎麼回事,請執行Gromer細節,而只使用throw;