簡體   English   中英

C#:應該捕獲所有異常

[英]C#: should all exceptions be caught

是應該在C#程序中捕獲所有異常,還是一些異常(例如堆棧溢出,內存不足等),應該允許程序崩潰,因為無法從它們中恢復?

您應該只捕獲您能夠處理的異常。 永遠不會捕獲異常並且什么也不做。 盡力避免首先發生異常。 這在.Net中尤為重要,因為異常會因堆棧跟蹤而導致性能下降。

當然,這取決於程序,但總的來說,只捕獲您可以以有意義的方式實際執行某些操作的異常。

請參閱有關捕獲OutOfMemoryException (通常可以從中恢復)的問題,以及關於捕獲StackOverflowException (通常不可能)的問題。

如果您正在編寫一個長時間運行的應用程序(例如Web服務器),那么您當然希望捕獲所有可能的異常以防止它們終止整個過程。 如果您正在編寫一個影響較小的最終用戶應用程序,那么可能只是記錄異常並快速失敗是最佳解決方案。

不可能(完全)為意外做好准備。

是的,至少應該記錄異常,在崩潰時給出關於系統/程序狀態的盡可能多的信息。 日志記錄應用程序塊是記錄錯誤的更強大的自動方法之一。

從商業應用程序開發POV中,應該捕獲所有異常,並且應該允許NONE使程序崩潰。 因為,現在,計算機用戶可以區分錯誤消息和應用程序崩潰對話框。

崩潰的產品給客戶留下了不好的印象。 當您無法恢復時,您可以禮貌地顯示錯誤消息,表示應用程序將立即退出,並且用戶必須再次啟動應用程序。 然后,當用戶在模態對話框上按下確定時,正常退出。

即使有時候,當無法恢復時,您也可以提供有用的信息。 例如,在內存不足的情況下,您可以建議用戶在再次啟動此應用程序之前關閉其他應用程序(如果有)。

雖然,最終結果是相同的,但友好的錯誤消息比OS生成的崩潰對話框給出了更好的印象。

關於該主題的MSDN文章:

http://msdn.microsoft.com/en-us/library/ms229005.aspx

強調:

通過在應用程序代碼中捕獲非特定異常(例如System.Exception,System.SystemException等)來避免處理錯誤。 有些情況下,處理應用程序中的錯誤是可以接受的,但這種情況很少見。

應用程序不應處理可能導致意外或可利用狀態的異常。 如果您無法預測異常的所有可能原因並確保惡意代碼無法利用生成的應用程序狀態,則應允許應用程序終止而不是處理異常。 ...

您應該只捕獲可以從中恢復的異常。 ...

難道喜歡使用空擲( throw;捕獲和重新拋出異常時)。 這是保留異常調用堆棧的最佳方法。

MSDN雜志關於.NET 4.0中的異常處理更改 - “使用Catch仍然錯誤(例外e)” - http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070057

如果您認為用戶以非預期的方式與您的應用程序交互可能會出現問題,那么您必須始終捕獲可能的異常,並使用相關的錯誤消息處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM