回答
不,這是不好的做法,如果你用相同的消息拋出另一個完全相同類型的異常。在這樣做的時候,你會使堆棧跟蹤變得複雜,並使調試變得更加痛苦。
如果你打算拋出一個新的異常,它應該與某些重要的方式有所不同。例如,它應該是另一種類型,或者以某種其他方式(如更具體的錯誤消息)闡明異常的原因。如果你不能做這兩件事情之一,那麼只需使用throw;
重新拋出當前異常。
或者,甚至更好,根本不抓住它。反思實際上也會讓堆棧跟蹤變得微不足道(當前幀的錯誤位置被設置爲重新拋出點而不是發生異常的地點),所以如果你沒有任何事情需要你親自處理異常,然後轉手 - 讓它傳播並讓調用者處理它。
只需重新拋出被捕獲的異常,不需要創建一個新異常。
catch(Exception e)
{
// Do some logging...
throw;
}
上的堆棧跟蹤重新拋出異常,並影響它的一些閱讀:http://msdn.microsoft.com/en-us/library/ms182363(v=vs.100).aspx
這取決於你正在嘗試做的。確切的代碼將是毫無意義的,但類似
catch(Exception ex)
{
throw new ApplicationSpecificException("Error while doing something specific: " + contextualData, ex);
}
將在調試時幫助很大。本身
catch(Exception e)
{
// Additional handling here
throw;
}
Throw
只需重新引發當前異常:
其實他的代碼不是*毫無意義*,它恰恰相反。它會將一個ApplicationSpecificException變成一個普通的「Exception」,這可能比只是無所事事更糟糕。 – Servy
@Servy - 這仍然[毫無意義](http://www.thefreedictionary.com/pointless)。 –
如果您需要重新把它扔之前做的事例外,做到這一點。如果你不需要在這裏處理它,首先不要抓住它。
此外,在你的例子中,你正在捕捉任何類型的異常,但拋出一個通用的Exception
- 可能不是很有用。
重新推出一個以上的性能和數據丟失的缺點是什麼? –
是的,數據丟失,特別是堆棧跟蹤。通過執行'throw e',你可以開始堆棧跟蹤。通過僅僅執行'throw',保留底層異常的堆棧跟蹤。 –
如果代碼真的只是:
try
{
// something
}
catch(Exception e)
{
throw new Exception(e.Message, e);
}
只是刪除try/catch語句,它沒有做任何富有成效。 throw new...
交換throw;
爲更好,但仍然沒有生產力。
,如果有別的東西在catch怎麼回事,請執行Gromer細節,而只使用throw;
- 1. 異常投擲最佳實踐
- 2. 投擲例外
- 3. 檢查在DTO例外 - 最佳實踐
- 4. 多個redmine實例最佳實踐
- 5. 實例化EntityManager的最佳實踐
- 6. 最佳實踐
- 7. 最佳實踐
- 8. 最佳實踐
- 9. 最佳實踐:
- 10. 最佳實踐
- 11. 最佳實踐
- 12. 最佳實踐
- 13. 最佳實踐
- 14. 最佳實踐
- 15. 最佳實踐
- 16. 最佳實踐
- 17. 最佳實踐
- 18. 最佳實踐
- 19. 最佳實踐
- 20. 最佳實踐
- 21. 最佳實踐
- 22. 最佳實踐
- 23. 最佳實踐
- 24. 最佳實踐{{}}
- 25. 最佳實踐
- 26. 最佳實踐
- 27. 最佳實踐
- 28. 最佳實踐
- 29. 最佳實踐
- 30. 最佳實踐
真的模糊的問題。你想達到什麼目的?不知道,你不能有一個「最佳做法」。 –
我已閱讀了一些遍佈此類異常處理的代碼。我相信這是不正確的,只是使用「扔」;是正確的。 –
如果它只是catch(Exception e){拋出新Exception ...',那麼只需刪除try/catch。我以前見過這種模式,我不知道它來自哪裏;但是對於時間的調試來說卻是一件很糟糕的事情。只要刪除try/catch,如果catch只是拋出('throw;'或'throw new Exception ...') –