2011-04-01 27 views
16

很多時候,它被提及只捕獲我可以處理的異常(拋出,包裝和/或記錄或執行其他一些操作)。哪種類型的異常不被捕獲?

哪些異常無法處理?這是不應該被抓住的意思嗎?我知道可能代表對象引用爲空的異常不應被捕獲,因爲它們是編程錯誤而不是用戶引發的。還有其他的例子嗎?另一個是ExecutionEngineException

此外,catch塊中的行爲過程總是在rethrow,wrap/rethrow和log之間?是否曾經有一個情況需要在catch塊中執行一些其他操作?

感謝

+4

我不太明白這個問題。你*知道*你可以處理哪些異常。這是你在異常處理程序中專門編寫*代碼*來處理的。這是你可以修復的問題。 **如果您不確定,您無法處理它們,因此您不應該抓住它們。** – 2011-04-01 00:15:34

+0

對此問題的回覆可能也有幫助:http://stackoverflow.com/q/7152354/625332 – Dmitry 2011-08-22 21:10:30

回答

15

通常的建議適用,只有抓住你可以處理。在框架內部有一個名爲IsCriticalException的實用程序函數,框架代碼的某些部分非常常用它來決定是否吞下異常。不妨走吧。它考慮以下關鍵:

  • 的NullReferenceException
  • StackOverflowException(抓不到)
  • OutOfMemoryException異常
  • ThreadAbortException
  • ExecutionEngineException(在4.0抓不到)
  • IndexOutOfRangeException
  • AccessViolationException

這是一個很好的清單。

+1

最正確編寫的應用程序不需要知道此列表,因爲它們會將所有未處理的應用程序同樣的:他們只會讓CLR終止進程。除了list_of_exceptions_that_is_considered_to_be_critical_by_Microsoft.VisualStudio.Shell.10.0以外,它們不會吞下所有內容。知道這種方法存在想法是有趣的。 – Dmitry 2011-08-22 20:44:02

+0

[這是你正在談論的財產?](http://msdn.microsoft.com/en-us/library/vstudio/microsoft.visualstudio.errorhandler.iscriticalexception.aspx)我沒有看到任何其他類似處理程序。 – Will 2013-09-23 02:59:53

+1

System.ClientUtils.IsCriticalException,它是一個內部方法。 – 2013-09-23 06:07:18

12

我會用埃裏克利珀的意見,並沒有趕上「致命」的例外:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

+0

這裏是C#的異常層次http://msdn.microsoft.com/en-us/library/z4c5tckx(v=vs.80).aspx – m4tt1mus 2011-04-01 00:10:37

+1

埃裏克還建議不要捕捉「Boneheaded」異常,因爲這樣做是隱藏錯誤在你的代碼中。 – Brian 2011-04-01 16:48:58

+0

正確的鏈接是[Exception Hierarchy](http://msdn.microsoft.com/en-us/library/z4c5tckx.aspx) – 2012-03-02 01:58:18

0

在catch塊作用的過程可能並不總是重新拋出,換行/ retrow和登錄。我已經看到db異常(如死鎖)在哪裏導致異常被拋出,然後catch邏輯嘗試再次執行數據庫操作,希望鎖定的資源不再被鎖定。