程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> .Net下未捕獲異常的處理

.Net下未捕獲異常的處理

編輯:關於ASP.NET

隨著.Net技術的發展,.Net技術被逐漸應用到很多大型的應用軟件項目中。這些項目的規模越來越大 ,很多項目中除了自己的代碼外還引用了很多第三方的.net組件。同時很多項目又被應用到很多關鍵的部 門,軟件系統的穩定性越來越至關重要。由於.Net 框架提供了非常強大的異常處理機制,同時對一些非 托管代碼很難控制的系統問題比如指針越界,內存洩漏等提供了很好的解決方案。相比非托管代碼構建的 系統,.Net構建的系統更加穩定。不過這並不是說.Net構建的系統就完全無懈可擊,很多由於代碼的不嚴 謹或者系統問題引發的故障將會導致.Net應用程序產生未捕獲異常,從而導致應用程序異常終止。本文將 對三種最常見的.Net應用的未捕獲異常處理進行闡述。

在開始本文之前,讓我們來看看.Net在什麼情況下會產生未捕獲異常。未捕獲異常從定義上說就是結 構化異常處理未能捕獲的異常。通俗的講就是發生在Try Catch塊意外的異常。那麼是不是我們在Main函 數中加一個Try Catch 塊就可以捕獲全部未捕獲異常了呢?答案是否定的。這裡面有兩種情況無法通過這 種方法捕獲:

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以上的應用似乎我們 截獲未捕獲異常已經毫無意義,其實不然。通過截獲為未捕獲異常,我們可以記錄下程序是再哪裡產生這 種未捕獲異常的,以便程序的開發者改進程序。我們也可以在當前應用退出前為系統做一些其他的保護工 作,比如備份數據,告警提示等等。

下面我們來看看三種常見的.Net應用分別如何來截獲未捕獲異常。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved