unhandledException詳細介紹


http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html

 

 

1. GC 產生的異常,這種異常通常因為Finalize函數中引發未捕獲異常引起。當然這並不絕對,一些系統問題比如內存耗盡有時候也會造成GC異常。 

2. 主線程以為的線程引發的未捕獲異常。這些異常我們往往可以在線程的主函數中用Try Catch 來捕獲,但如果系統中使用了外部的組件,或者甚至是.Net 框架自帶的一些系統組件,由這些組件的線程引發的異常,調用代碼無法通過Try Catch來捕獲。

從上面兩點來看,即使我們的代碼在每個地方都加了Try Catch ,也不能百分百杜絕未捕獲異常的發生。 

鑒於此,為了提高系統的健壯性和可維護性,我們需要通過一種方法來截獲這些未捕獲異常,並進行適當的處理。

.Net 的設計者已經考慮到這些問題,並且為我們提供了一個叫 UnhandledExceptionEventHandler 的事件,通過這個事件,我們可以截獲未捕獲異常,並進行處理。

這個事件的事件參數UnhandledExceptionEventArgs e, 有兩個屬性,一個是ExceptionObject,這個屬性返回為截獲異常的對象實例。還有一個屬性是IsTerminating,這個屬性告訴我們這個異常是否會導致應用終止。這里需要說明的是,對於.Net1.1 和 .Net2.0及以上,情況是不一樣的,.Net1.1 只有在主線程中的未捕獲異常才會終止應用程序,而.Net2.0及以上版本則是始終終止應用程序。如果不終止應用程序,而是有CLR 將當前異常消化,系統的運行狀態很可能不可控,最后可能會發生更大的故障,所以.Net2.0以后,對於所有未捕獲異常,一律終止當前應用。這樣看來,對於.net2.0以上的應用似乎我們截獲未捕獲異常已經毫無意義,其實不然。通過截獲為未捕獲異常,我們可以記錄下程序是再哪里產生這種未捕獲異常的,以便程序的開發者改進程序。我們也可以在當前應用退出前為系統做一些其他的保護工作,比如備份數據,告警提示等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM