Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇
作者:Terrylee
一.概述
使開發(fā)人員和決策人員能夠針對發(fā)生在企業(yè)應(yīng)用程序體系結(jié)構(gòu)層的異常處理創(chuàng)建一致的策略。它的實現(xiàn)方法如下:
(1)它支持整個應(yīng)用程序體系結(jié)構(gòu)層的異常處理,而不僅限于服務(wù)接口的界限。
(2)它使得異常處理策略可以在管理層定義和維護,以便決策人員(可能是系統(tǒng)管理員和開發(fā)人員)可以定義如何處理異常。他們可以維護和修改控制異常處理的規(guī)則集,而無需更改塊的應(yīng)用程序代碼。
(3)它提供了常用的異常處理功能,例如記錄異常信息的功能、通過將原始異常替換為其他異常來隱藏敏感信息的功能,以及通過將原始異常打包到另一個異常中來添加異常的上下文信息的功能。這些功能封裝在名為 Exception handlers 的 .NET 類中。
(4)它可以合并多個異常處理程序以產(chǎn)生某個異常所需的響應(yīng),例如先記錄異常信息,再將原始異常替換為其他異常。
(5)它使開發(fā)人員能夠創(chuàng)建自己的異常處理程序。
(6)它以一致的方式調(diào)用異常處理程序。這意味著,處理程序可以在應(yīng)用程序之中和之間的多種場合下使用。
常見情況
異常處理應(yīng)用程序塊被設(shè)計為支持包含在應(yīng)用程序組件的 catch 語句中的典型代碼。該應(yīng)用程序塊允許開發(fā)人員將此邏輯封裝為可重用的異常處理程序,而不是在應(yīng)用程序組件的相同 catch 塊中重復(fù)這段代碼(例如,記錄異常信息)。異常處理程序是封裝異常處理邏輯和實現(xiàn)名為 IExceptionHandler 的異常處理應(yīng)用程序塊接口的 .NET 類。異常處理應(yīng)用程序塊包含三個異常處理程序:
包裝處理程序:此異常處理程序可將一個異常包裝到另一個異常中。
替換處理程序:此異常處理程序可將一個異常替換為另一個異常。
日志處理程序:此異常處理程序可格式化異常信息,例如消息和堆棧跟蹤等。然后,日志處理程序?qū)⒃撔畔⑻峁┙o企業(yè)程序庫日志和規(guī)范應(yīng)用程序塊,以便可以將它發(fā)布。
異常處理應(yīng)用程序塊可讓您將異常類型與指定的策略相關(guān)聯(lián)。您可以使用配置控制臺來完成此項工作。策略可指定在應(yīng)用程序塊處理特定異常類型時執(zhí)行的異常處理程序。您可以將這些處理程序串聯(lián)起來,這樣,在處理關(guān)聯(lián)的異常類型時就可以執(zhí)行一系列處理程序
二.幾個重要的概念
1.策略:
確定一系列的異常類型是如何攔截并處理的
每一個策略可以包含多個異常類型
每個應(yīng)用程序支持多個異常策略
2.異常類型:
可以使用Exception功能的異常類型應(yīng)該是一個System.Exception類型或從此類繼承下來的類
每一個異常類型可以包含一個或多個Handler
每一個異常均可以通過映射到.NET中的特定類型,從而被處理
3.處理器:
異常捕獲后進行處理的方式有日志,包裝,替換等;
每一個異常類型可以有多個異常處理器;
每一個異常捕獲處理器均有機會修改原有異常;
每一個異常捕獲處理器均有機會將自己的信息通過異常傳遞給下一個異常處理程序;
三.編寫示例程序:
1.在開始進行配置之前,我們先編寫一個異常包裝的類。
?1using?System;
?2using?System.Runtime.Serialization;
?3
?4namespace?EnterpriseExceptionHandler
?5{
?6????/**////?<summary>
?7????///?功能說明:創(chuàng)建一個包裝異常的類,需要繼承ApplicationException
?8????///?程序作者:Terrylee
?9????///?編寫日期:2005年11月13日
10????///?</summary>
11????public?class?ExceptionHelper:ApplicationException
12????{
13????????/**////?<summary>
14????????///?默認的構(gòu)造函數(shù)
15????????///?</summary>
16????????public?ExceptionHelper()?:?base()?
17????????{
18
19????????}
20
21????????/**////?<summary>
22????????///?序列化錯誤信息
23????????///?</summary>
24????????///?<param?name="message">錯誤信息</param>
25????????public?ExceptionHelper(string?message)?:?base(message)?
26????????{
27
28????????}
29
30????????/**////?<summary>
31????????///?序列化錯誤信息,內(nèi)部異常產(chǎn)生的原因.
32????????///?</summary>
33????????///?<param?name="message">錯誤信息</param>
34????????///?<param?name="exception">引起當(dāng)前的異常</param>
35????????public?ExceptionHelper(string?message,?Exception?exception)?:?base(message,?exception)?
36????????{
37
38????????}
39
40????????/**////?<summary>
41????????///?序列化數(shù)據(jù)
42????????///?</summary>
43????????///?<param?name="info">序列化的數(shù)據(jù)對象</param>
44????????///?<param?name="context">描述.</param>
45????????protected?ExceptionHelper(SerializationInfo?info,?StreamingContext?context)?:base(info,?context)?
46????????{
47
48????????}
49????}
50}
51
2.打開配置工具,創(chuàng)建一個異常應(yīng)用程序塊。
?
3.創(chuàng)建一個策略。
?
4.命名為Wrap Policy。
?
5.創(chuàng)建一個異常類型Exception。
?
6.創(chuàng)建一個異常處理器,命名為Wrap Handler,選擇它的WrapExceptionTypeName為我們剛才創(chuàng)建的那個異常包裝類。
?
7.同樣,再創(chuàng)建一個替換策略和日志策略,分別命名為Replace Policy和Log Policy,注意Log Policy依賴于日志和監(jiān)測應(yīng)用程序塊。
8.拷貝目錄(我每次都說,大家可能會覺著煩^_^,不過我自己總是忘了這一條,所以不得不每次提醒大家)。
copy?"$(ProjectDir)\*.config"?"$(TargetDir)"?>?Nul
9.在程序中編寫代碼(代碼編寫很簡單)。
?1/**////?<summary>
?2????????///?包裝策略
?3????????///?</summary>
?4????????///?<param?name="sender"></param>
?5????????///?<param?name="e"></param>
?6????????private?void?btn_Wrap_Click(object?sender,?System.EventArgs?e)
?7????????{
?8????????????try
?9????????????{
10????????????????Exception?ex?=?new?Exception();
11????????????????throw?ex;
12????????????}
13????????????catch(DllNotFoundException?ex)
14????????????{
15????????????????bool?Flag?=?ExceptionPolicy.HandleException(ex,"Wrap?Policy");
16
17????????????????if(Flag)
18????????????????{
19????????????????????throw;
20????????????????}
21????????????}
22????????????/**////我們可以多次捕獲異常
23????????????catch(Exception?ex)
24????????????{
25????????????????bool?Flag?=?ExceptionPolicy.HandleException(ex,"Wrap?Policy");
26
27????????????????if(Flag)
28????????????????{
29????????????????????throw;
30????????????????}
31????????????}
32????????}
33????????
34????????/**////?<summary>
35????????///?替換策略
36????????///?</summary>
37????????///?<param?name="sender"></param>
38????????///?<param?name="e"></param>
39????????private?void?btn_Replace_Click(object?sender,?System.EventArgs?e)
40????????{
41????????????try
42????????????{
43????????????????Exception?ex?=?new?Exception();
44????????????????throw?ex;
45????????????}
46????????????catch(Exception?ex)
47????????????{
48????????????????bool?Flag?=?ExceptionPolicy.HandleException(ex,"Replace?Policy");
49
50????????????????if(Flag)
51????????????????{
52????????????????????throw;
53????????????????}
54????????????}
55????????}
56????????
57????????/**////?<summary>
58????????///?日志策略
59????????///?</summary>
60????????///?<param?name="sender"></param>
61????????///?<param?name="e"></param>
62????????private?void?btn_Log_Click(object?sender,?System.EventArgs?e)
63????????{
64????????????try
65????????????{
66????????????????Exception?ex?=?new?Exception();
67????????????????throw?ex;
68????????????}
69????????????catch(Exception?ex)
70????????????{
71????????????????bool?Flag?=?ExceptionPolicy.HandleException(ex,"Log?Policy");
72
73????????????????if(Flag)
74????????????????{
75????????????????????throw;
76????????????????}
77????????????}
78????????}
10.執(zhí)行程序,單擊日志策略。在事件查看器中查看相應(yīng)的日志記錄。
結(jié)束語:異常處理應(yīng)用程序塊相對于其他應(yīng)用程序塊來說是比較簡單的,入門篇里就介紹這么多了J
轉(zhuǎn)載于:https://www.cnblogs.com/Terrylee/archive/2005/11/14/275659.html
總結(jié)
以上是生活随笔為你收集整理的Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。