自建工具集開發文件------異常處理(1.0.0.1) (轉)

amyz發表於2007-08-17
自建工具集開發文件------異常處理(1.0.0.1) (轉)[@more@]

自建工具集開發文件------異常處理(1.0.0.1:namespace prefix = o ns = "urn:schemas--com::office" />

 

 

版本號

建立人

建立時間

備註

1.0.0.1

穆仕途

-12-20

草稿

 

 

關鍵字:、工具集、異常、錯誤

正文

 

  提供了完整、功能強大的異常處理機制,在此寫這個異常處理類的主要目的是為了把異常集中處理,並記錄日誌,方便於測試和維護。並且可以把它放到別的中而不需要做上的改動,只需要修改部分資訊而已。

 

設計目標

 

1.  使用自定義的異常訊息來給出提示和異常資訊。

2.  儘量簡化對異常類的複雜度。

3.  精確定位異常發生的位置。

 

.Net Framework的異常處理機制(此部分內容摘自.Net幫助文件

 

C# 中的異常提供了一個處理系統級和應用程式級錯誤狀態的結構化的、統一的和型別的方法。所有的異常必須由從 System.Exception 派生的類型別的例項表示。發生異常時,系統將搜尋可以處理該異常的最近的 catch 子句,而這是由異常的執行時型別確定的。首先,搜尋當前的方法以查詢一個詞法上封閉的 try 語句,並按順序考慮與該 try 語句相關聯的 catch 子句。如果上述操作失敗,則搜尋呼叫當前方法的方法以查詢一個詞法上封閉的 try 語句,它封閉當前方法呼叫的場所。此搜尋將一直進行下去,直到找到可以處理當前異常的 catch 子句(透過指定與被引發的異常的執行時型別屬於同一個類或基類的異常類)。不指定異常類的 catch 子句可以處理任何異常。

找到匹配的 catch 子句後,系統將把控制轉移到該 catch 子句的第一條語句。在 catch 子句的開始前,系統將首先按順序執行任何與巢狀程度大於捕捉到該異常的 try 語句的 try 語句相關聯的 finally 子句。

如果沒有找到匹配的 catch 子句,則發生下列兩種情況之一:

●  如果對匹配的 catch 子句的搜尋到達靜態構造或靜態欄位初始值設定項,則在觸發該靜態建構函式的呼叫的場所引發 System.TypeInitializationExceptionSystem.TypeInitializationException 的內部異常包含最初引發的異常。

●  如果對匹配的 catch 子句的搜尋到達最初啟動該執行緒的程式碼,則將終止執行緒的執行。此類終止的影響是由實現定義的。

特別值得注意的是在解構函式執行過程中發生的異常。如果在解構函式執行過程中發生異常且該異常未被捕獲,則將終止該解構函式的執行,並呼叫基類的解構函式(如果有)。如果沒有基類(如 System. 中的情況),或者如果沒有基類解構函式,則該異常將被放棄。

 

設計思想:

 

系統設計和執行中會遇到兩種異常,一種是由系統執行時丟擲的異常,這是依賴於.Net Framework,可以透過try塊來捕獲,比如開啟連線;另一種是自定義的異常,比如說輸入資料格式錯誤所引發的異常,或許只應該說成是錯誤吧。

 

處理時:

1.  用try塊來捕獲系統可能引發的異常,轉換為自己的異常後丟擲,不做別的處理;

2.  需要引發異常的地方,例項化一個自己的異常後丟擲,不做別的處理;

3.  一般情況下,所有中間的處理過程皆不對下層丟擲的異常做任何處理,也不捕獲;

4.  最上層,即直接和介面互動的一層,捕獲所有的異常,所有下層丟擲的異常,只需要從異常中取出給使用者顯示的訊息即可,在這個層次系統引發的異常,按第一條進行處理。

 

下面給出所有的實現細節:

 

異常資訊配置

 

異常資訊存放於XML檔案exceptionconfig.xml中,檔案格式如下所示:

 

 

 

 

 

 

 

 

 

檔案說明:

 

根接點名稱:ExceptionConfig,請注意大小寫;

每一個Exception接點對應一條異常資訊,各欄位的意義如下:

*  id:異常的編號,用於檔案內標識異常,在給使用者顯示錯誤資訊的時候也將顯示此錯誤號,從1開始編號,999是一個自定義預設異常資訊,不能修改這個結點。

*  name:異常的名稱,用於編碼中引用異常,所以在此檔案中,每個異常的名稱不能重複,否則取最前面的異常,後面的結點將被覆蓋。命名規則建議:以ERROR開始,用下劃線分割各個單詞,從名字上可以看出異常的大致意思。

*  userMsg:使用者訊息,發生異常的時候,將給使用者直接顯示此資訊。

*  logMsg:日誌訊息,發生異常的時候,將記錄到日誌檔案的資訊,儘量描述清楚。

*  level:異常的等級,標誌異常的嚴重性,取值從1到5(包括1,5),嚴重性越高值越大。

 

異常類說明

 

欄位:

 

  private string exceptionName = null;

  private int exceptionNo = 0;

  private Constant.ExceptionLevel exceptionLevel;

  private string userMsg = null;

 private string logMsg = null;

 

 

*  exceptionName:異常的名稱,和XML檔案中的name相對應。

*  exceptionNo:異常的編號,用於顯示給終端使用者,和XML檔案中的id相對應。

*  exceptionLevel:異常的等級,列舉型,在常量中有定義,取值從1到5,對應於XML檔案中的level欄位。

*  userMsg:使用者訊息,和XML檔案中的userMsg相對應。

*  logMsg:日誌訊息,和XML檔案中的logMsg相對應。

 

屬性:

 

public string UserMsg{get, set}

public string LogMsg{get, set}

 

公共構造器:

 

public utilException(){}

public utilException(string _userMessage, string _logMessage, Constant.ExceptionLevel _exceptionLevel) {}

public utilException(string _exceptionName) {}

public utilException(System.Exception e, string _userMsg) {}

 

*  _exceptionName:異常的名稱,和XML檔案中的name相對應,構造器將透過這個欄位從XML檔案中獲取錯誤描述資訊來初始化異常類的各個欄位。

*  可以在程式中提供異常的使用者訊息、日誌訊息、等級來初始化異常,但是不提倡這樣,將給維護帶來困難。

*  儘量使用System.Exception來例項化自己的異常類,這樣可以自動把堆疊資訊記錄到日誌中。

*  可以用異常的名稱來初始化異常,構造器從XML檔案中獲取異常資訊。

 

方法說明:

 

private void WriteLog()

private string GetLogMsg()

private string GetExceptionClass()

private string GetInnerMessage()

 

程式中所有的方法都是私有的,在構造器中,將呼叫WriteLog()來書寫日誌,其中方法GetExceptionClass()用於獲取InnerException中的堆疊資訊,GetInnerMessage()用於獲取InnerException中的錯誤資訊,對於自己初始化的異常類返回空。

 

存在的問題:

 

*  自己初始化的異常類,無法從中獲取引發異常時的堆疊資訊,只有用系統引發的異常來初始化自己的異常類的時候可以獲取異常時的堆疊資訊。

*  異常等級的設定,當初的想法是根據錯誤的不同等級來做相應的處理,甚至根據等級的不同,執行時配置寫日誌功能的開關。

 

結束語:

 

  我只是實現了很簡單的功能,寫在這裡的介紹也很粗略,沒有附帶內部詳細的實現細節,有對原始碼感興趣的朋友可以給我發信191471650@qq.com,首先介紹這個類的目的是為了在後面的實現中將會用到這個類。

 

  這樣的實現肯定讓大家大失所望,這也是閉門造車的結果,希望各位朋友看了以後能給我些改進的意見,萬分感謝,我將不斷完善,繼續努力。

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-963773/,如需轉載,請註明出處,否則將追究法律責任。