很多時候,它被提及只捕獲我可以處理的異常(拋出,包裝和/或記錄或執行其他一些操作)。哪種類型的異常不被捕獲?
哪些異常無法處理?這是不應該被抓住的意思嗎?我知道可能代表對象引用爲空的異常不應被捕獲,因爲它們是編程錯誤而不是用戶引發的。還有其他的例子嗎?另一個是ExecutionEngineException
。
此外,catch塊中的行爲過程總是在rethrow,wrap/rethrow和log之間?是否曾經有一個情況需要在catch塊中執行一些其他操作?
感謝
很多時候,它被提及只捕獲我可以處理的異常(拋出,包裝和/或記錄或執行其他一些操作)。哪種類型的異常不被捕獲?
哪些異常無法處理?這是不應該被抓住的意思嗎?我知道可能代表對象引用爲空的異常不應被捕獲,因爲它們是編程錯誤而不是用戶引發的。還有其他的例子嗎?另一個是ExecutionEngineException
。
此外,catch塊中的行爲過程總是在rethrow,wrap/rethrow和log之間?是否曾經有一個情況需要在catch塊中執行一些其他操作?
感謝
通常的建議適用,只有抓住你可以處理。在框架內部有一個名爲IsCriticalException的實用程序函數,框架代碼的某些部分非常常用它來決定是否吞下異常。不妨走吧。它考慮以下關鍵:
這是一個很好的清單。
最正確編寫的應用程序不需要知道此列表,因爲它們會將所有未處理的應用程序同樣的:他們只會讓CLR終止進程。除了list_of_exceptions_that_is_considered_to_be_critical_by_Microsoft.VisualStudio.Shell.10.0以外,它們不會吞下所有內容。知道這種方法存在想法是有趣的。 – Dmitry 2011-08-22 20:44:02
[這是你正在談論的財產?](http://msdn.microsoft.com/en-us/library/vstudio/microsoft.visualstudio.errorhandler.iscriticalexception.aspx)我沒有看到任何其他類似處理程序。 – Will 2013-09-23 02:59:53
System.ClientUtils.IsCriticalException,它是一個內部方法。 – 2013-09-23 06:07:18
我會用埃裏克利珀的意見,並沒有趕上「致命」的例外:
http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx
在catch塊作用的過程可能並不總是重新拋出,換行/ retrow和登錄。我已經看到db異常(如死鎖)在哪裏導致異常被拋出,然後catch邏輯嘗試再次執行數據庫操作,希望鎖定的資源不再被鎖定。
我不太明白這個問題。你*知道*你可以處理哪些異常。這是你在異常處理程序中專門編寫*代碼*來處理的。這是你可以修復的問題。 **如果您不確定,您無法處理它們,因此您不應該抓住它們。** – 2011-04-01 00:15:34
對此問題的回覆可能也有幫助:http://stackoverflow.com/q/7152354/625332 – Dmitry 2011-08-22 21:10:30