EL異常模塊的理解

1、簡介

只要是編寫代碼,我們就會面對異常處理的問題。系統預定義異常由於肩負着提示、調試等很多功能,因此當異常發生時,會有非常詳細的異常信息。當我們編寫商用程序時,如果程序出現運行時異常,顯示給用戶的信息都要求是user-friendly的,而不是系統級,特別是系統預定義異常會deliver一些敏感信息,如果被別有用心的人獲取,是非常危險的,所以當異常出現時,我們要屏蔽掉這些敏感信息。對異常的處理一般有四種方式:
 根據源異常建立一個新異常,重新將此新異常拋出。
 取代源異常,拋出一個別的異常。
 Log異常,用於查看、排錯等。
 不做任何處理,只是將傳播路徑截斷。
雖然AOP是異常處理最佳方案,但技術上遠未成熟,我們都還是用傳統的方式來處理異常。對應這幾種情況,我們一般都會這樣來處理:
 

 1) //  提示用戶的處理方式,出錯後提示用戶
try
{
    // 正常執行語句;
}
catch(Exception ex)
{
    String formattedInfo = FormatException(ex);
    Logging.Log(formattedInfo); // 或Logger.Log(e);
Throw new MyException("出錯了。");
// 或者直接提示客戶
//MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
//lblError.Text = errorMsg;
}
2) // logging,出錯後作記錄
catch(SomeException e)
{
    string formattedInfo = FormatException(e);
    Logger.Log(e);


    throw e;
}

3) //replace,拋出一個新異常,屏蔽掉敏感信息
catch(SomeException e)
{
    CustomException myException = new CustomException(“XXXXXXXXXXXXXXXXXXXXXX”);

    throw myException;
}
4) //wrapping 包封原來的異常,添加Context信息後,重新拋出
catch(SomeException e)
{
    CustomException myException = new CustomException(e);

    throw myException;
}
5) //propagating 記錄後,繼續傳播之
catch(SomeException e)
{
    // Exception handling code to be done before propagating
    string formattedInfo = FormatException(e);
    Logger.Log(e);

    throw e;
}
一般來說,象上面這樣的處理方式都非常不靈活,有極大的代碼重複,當要求發生變化時,可能源代碼要做大量的機械修改。
異常處理應用程序塊在充分滿足上述異常處理要求的基礎上,使我們在不同項目之間、同一個項目的不同開發人員之間建立起了統一的異常處理策略。當需求發生改變時,我們可以用配置工具進行修改配置文件,不用去修改源碼,從而不用重新編譯、發佈程序。
我們知道,在.Net裏一個異常發生時,系統會拋出一個Exception類型或其子代的對象,習慣上我們要對這個對象進行一些處理,以排除錯誤或提示用戶,常見的處理方式有提示用戶、包裝後重新拋出、用另一個異常對象取而代之、記錄等。EHAB就是根據這樣的要求而設計的,但她並不負責具體如何處理,而是做了大量基礎工作,使對異常的處理非常簡單,同時統一了處理策略,增加了靈活性。
下面我們以常用的異常處理方式來說明異常處理應用程序塊的用法,來看看使用EHAB是多麼簡單
2、用配置控制檯配置異常處理應用程序塊
①添加異常處理應用程序塊
添加異常處理應用程序塊後,就要添加一個或多個Exception Policy。一個異常處理應用程序塊可以維護一個或多個Exception Policy,異常處理策略往往代表了對異常的處理方式,常見的策略有包封、取代、繼續傳播、處理並繼續、記錄等等,當然異常處理策略如何分類、有哪些異常處理策略,都是你自己說了算,只是取一個比較有意義的名字就行了。
每種Exception Policy可以管理多種類型的異常,而每種類型的Exception又可以有多個Handler(異常處理器,在Exception類的繼承層次結構中,可以針對每種類型的Exception設置一個Handler,這樣一個子代Exception就可以有多個Handler)。
②添加Exception Policy
添加幾個Policy,適當修改Policy的名稱,如Wrap Policy、Replace Policy、Log Policy、Propagate Policy、GlobalPolicy等。
③給每個Policy添加幾個Exception
當添加一個Exception類型時,我們不用自己鍵入,嚮導會提示我們選一個,這個異常類型可以是系統預定義的,也可以是來自某個程序集的,還可以是我們自己定義的。
我們按自己的需要給每種Policy添加好Exception。然後針對每種類型的Exception設置處理活動PostHandlingAction。PostHandlingAction有三種分別是None、NotifyRethrow、ThrowNewException。
None表示此異常被內部處理掉了,調用者不用再處理了。
NotifyRethrow表示Application.ThreadException事件的處理器將重新拋出異常
ThrowNewException表示這類異常你可以用一個新的異常類包封或取代之。
④設置Exception的處理器handler
每個Exception一般都會設置一個或多個handler,當然也可以不設。Replace Handler要設置好其取代的異常類型,Wrap Handler也要置好其包封的異常類型(即我們自定義的handler),Log Handler要置好LogCategory。
⑤設置完畢,保存。

3、寫代碼
String policy = “Wrap Policy”;
Try
{
// 。。。。。。。
}
catch (Exception ex)
{
    if (ExceptionPolicy.HandleException(ex, policy))
    throw;
}
其他類型Policy的代碼與此類似,但異常的PostHandlingAction設爲NotifyRethrow時,我們要將定義一個異常處理handler,並掛接到Application.ThreadException事件上。我們可以看到,對異常的不同處理方式其代碼是一致的,而不象開始時我們列出的代碼,不同的處理方式代碼是不同的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章