黃聰:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

原文: 黃聰:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

使用企業庫異常處理應用程序模塊的優點:html

  1. 它支持整個應用程序體系結構層的異常處理,而不只限於服務接口的界限。 
  2. 它使得異常處理策略能夠在管理層定義和維護,以便決策人員(多是系統管理員和開發人員)能夠定義如何處理異常。他們能夠維護和修改控制異常處理的規則集,而無需更改塊的應用程序代碼。 
  3. 它提供了經常使用的異常處理功能,例如記錄異常信息的功能、經過將原始異常替換爲其餘異常來隱藏敏感信息的功能,以及經過將原始異常打包到另外一個異常中來添加異常的上下文信息的功能。這些功能封裝在名爲 Exception handlers .NET 類中。 
  4. 它能夠合併多個異常處理程序以產生某個異常所需的響應,例如先記錄異常信息,再將原始異常替換爲其餘異常。 
  5. 它使開發人員可以建立本身的異常處理程序。 
  6. 它以一致的方式調用異常處理程序。這意味着,處理程序能夠在應用程序之中和之間的多種場合下使用。 

 

下面咱們來試試看用EL5.0的異常處理模塊到底能作些什麼,按需求來作分析是最好的辦法,那咱們能夠模擬的提出下列幾個需求,看看用異常處理模塊如何靈活的解決它們:數據庫

1.       但願能過濾程序中某些異常,即在發生這些異常的時候不會被拋出.要求是配置簡單,只用修改一處地方就能控制全部相應的異常.ide

2.       發生某種異常的時候被自動替換成另一個異常post

3.       發生某種異常的時候被自動包裝到另一個異常中測試

4.       發生某種異常的時候被自動記錄在指定的日誌記錄策略中,能夠是記錄到數據庫或者文件中.url

 

下面介紹如何使用Microsoft Enterprise Library 5.0中的異常處理程序模塊來處理上面的問題:spa

1.      運行EntLibConfig.exe, 選擇Blocks菜單 ,單擊 Add Exception Handling Settings . 3d


 

 

2.      爲了模擬第一個問題,咱們要先刪除原有的All Exceptions,由於它表示全部的異常均截取,咱們刪除了它,再在Policy面板上右鍵—Add Exception Type,在彈出的異常類型選擇窗口中,咱們選擇一個異常System.FormatException:日誌


 

 

 

3.       點擊 File菜單,單擊 Save,保存爲一個App.config文件,能夠先保存到桌面,以後要用到它.code

 

4.       建立一個新的控制檯應用程序,App.config添加到程序內,並加入須要的Dll文件,並添加須要的引用:

 

添加引用:

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;
    測試 :
代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;


namespace test
{
class Program
{
static void Main( string [] args)
{
bool haveException = false ;

ExceptionManager em
= EnterpriseLibraryContainer.Current.GetInstance < ExceptionManager > ();

try
{
// FormatException異常捕獲設置爲None,將不會被拋出
em.Process(NoThrowException, " Policy " );
}
catch (Exception)
{
haveException
= true ;
Console.WriteLine(
" 捕獲到異常! " );
}

if (haveException == false )
{
Console.WriteLine(
" 未捕獲到任何異常! " );
}
}

private static void NoThrowException()
{
int i = Int32.Parse( " A " );
Console.WriteLine(
" 發生異常,不執行該指令 " );
}
}
}
 

 

運行結果:


 

 

到此爲止,咱們已經解決了第一個問題,當你的程序想只過濾System.FormatException異常的時候,能夠用上面的方法實現,若是想過濾其餘的異常,只用在EL5中添加便可,無需更改程序中的任何代碼.

 

5.       下面咱們來解決第二個問題,讓咱們回到EL5.0,Policy面板上右鍵Add Exception Type,在彈出的異常類型選擇窗口中,咱們選擇一個異常System.IO.FileNotFoundException,再在FileNotFoundException面板上右鍵Add HandlersAdd Replace Handler,在創建好的Replace Handler面板中點擊Replace Exception Type右邊的按鈕,選擇要替換成的異常類型,咱們選擇:System.TimeputException: 


 

 

6.       Save一下,更新App.config文件,修改源程序以下:

代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;


namespace test
{
class Program
{
static void Main( string [] args)
{
// bool haveException = false;

ExceptionManager em
= EnterpriseLibraryContainer.Current.GetInstance < ExceptionManager > ();

// try
// {
// // FormatException異常捕獲設置爲None,將不會被拋出
// em.Process(NoThrowException, "Policy");
// }
// catch (Exception)
// {
// haveException = true;
// Console.WriteLine("捕獲到異常!");
// }

// if (haveException == false)
// {
// Console.WriteLine("未捕獲到任何異常!");
// }

// FileNotFoundException異常捕獲被設置爲ThrowNewException,將被替換爲TimeoutException異常
try
{
em.Process(ReplaceHandler,
" Policy " );
}
catch (TimeoutException e)
{
Console.WriteLine(
" 捕獲到TimeoutException異常!異常信息: " + e.Message);
}
}

private static void ReplaceHandler()
{
File.Open(
" test.txt " , FileMode.Open);
Console.WriteLine(
" 發生異常,不執行該指令 " );
}

private static void NoThrowException()
{
int i = Int32.Parse( " A " );
Console.WriteLine(
" 發生異常,不執行該指令 " );
}
}
}

 

7.       運行結果:


 

到此爲止咱們便解決了第二個問題,是否是很簡單呀,這就是EL的便利之處~

 

8.       接着處理第三個問題,回到EL,Policy面板上右鍵—Add Exception Type,在彈出的異常類型選擇窗口中,咱們選擇一個異常System. NullReferenceException,再在NullReferenceException面板上右鍵—Add Handlers—Add Wrap Handler,在創建好的Wrap Handler面板中點擊Wrap Exception Type右邊的按鈕,選擇要替換成的異常類型,咱們選擇: System.ApplicationException: 

 

9.       Save一下,更新App.config文件,修改源程序以下:

 

代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;


namespace test
{
class Program
{
static void Main( string [] args)
{
// bool haveException = false;

ExceptionManager em
= EnterpriseLibraryContainer.Current.GetInstance < ExceptionManager > ();

// try
// {
// // FormatException異常捕獲設置爲None,將不會被拋出
// em.Process(NoThrowException, "Policy");
// }
// catch (Exception)
// {
// haveException = true;
// Console.WriteLine("捕獲到異常!");
// }

// if (haveException == false)
// {
// Console.WriteLine("未捕獲到任何異常!");
// }

// Console.WriteLine("-----------------------------------------------");
/// /FileNotFoundException異常捕獲被設置爲ThrowNewException,將被替換爲TimeoutException異常
// try
// {
// em.Process(ReplaceHandler, "Policy");
// }
// catch (TimeoutException e)
// {
// Console.WriteLine("捕獲到TimeoutException異常!異常信息:" + e.Message);
// }

// Console.WriteLine("-----------------------------------------------");
/// /NullReferenceException異常捕獲被設置爲ThrowNewException,將被包裝爲ApplicationException異常
try
{
em.Process(WrapHandler,
" Policy " );
}
catch (ApplicationException e)
{
Console.WriteLine(
" 捕獲到ApplicationException異常,其被包裝的異常爲{0}! " , e.InnerException.GetType().ToString());
Console.WriteLine(
" 異常信息:{0} " , e.Message);
}
}

private static void WrapHandler()
{
Hashtable ht
= new Hashtable();
ht[
" test " ].ToString();
Console.WriteLine(
" 發生異常,不執行該指令 " );
}

private static void ReplaceHandler()
{
File.Open(
" test.txt " , FileMode.Open);
Console.WriteLine(
" 發生異常,不執行該指令 " );
}

private static void NoThrowException()
{
int i = Int32.Parse( " A " );
Console.WriteLine(
" 發生異常,不執行該指令 " );
}
}
}
 

 

10.   運行結果:


 

 到此爲止,咱們又解決了第三個問題.

 

11.   接着處理第四個問題,回到EL,Policy面板上右鍵—Add Exception Type,在彈出的異常類型選擇窗口中,咱們選擇一個異常System. NullReferenceException,再在NullReferenceException面板上右鍵—Add Handlers—Add Logging Exception Handler,將日誌策略設置爲文件記錄方式,詳細步驟在此很少講,你們能夠看看我以前寫的日誌處理模塊教程: 


 

 

12.   Save一下,更新App.config文件,修改源程序以下:

 

代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.Collections.Specialized;

using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;


namespace test
{
class Program
{
static void Main( string [] args)
{
// bool haveException = false;

ExceptionManager em
= EnterpriseLibraryContainer.Current.GetInstance < ExceptionManager > ();

// try
// {
// // FormatException異常捕獲設置爲None,將不會被拋出
// em.Process(NoThrowException, "Policy");
// }
// catch (Exception)
// {
// haveException = true;
// Console.WriteLine("捕獲到異常!");
// }

// if (haveException == false)
// {
// Console.WriteLine("未捕獲到任何異常!");
// }

// Console.WriteLine("-----------------------------------------------");
/// /FileNotFoundException異常捕獲被設置爲ThrowNewException,將被替換爲TimeoutException異常
// try
// {
// em.Process(ReplaceHandler, "Policy");
// }
// catch (TimeoutException e)
// {
// Console.WriteLine("捕獲到TimeoutException異常!異常信息:" + e.Message);
// }

// Console.WriteLine("-----------------------------------------------");
/// /NullReferenceException異常捕獲被設置爲ThrowNewException,將被包裝爲ApplicationException異常
// try
// {
// em.Process(WrapHandler, "Policy");
// }
// catch (ApplicationException e)
// {
// Console.WriteLine("捕獲到ApplicationException異常,其被包裝的異常爲{0}!", e.InnerException.GetType().ToString());
// Console.WriteLine("異常信息:{0}", e.Message);
// }

// Console.WriteLine("-----------------------------------------------");
// 捕獲ArgumentOutOfRangeException異常,並寫入日誌
try
{
em.Process(NotifyRethrow,
" Policy " );
}
catch (ArgumentOutOfRangeException)
{
Console.WriteLine(
" 捕獲到ArgumentOutOfRangeException異常,並寫入日誌! " );
}
}

private static void NotifyRethrow()
{
List
< string > list = new List < string > ();
string str = list[ 1 ];
Console.WriteLine(
" 發生異常,不執行該指令 " );
}

private static void WrapHandler()
{
Hashtable ht
= new Hashtable();
ht[
" test " ].ToString();
Console.WriteLine(
" 發生異常,不執行該指令 " );
}

private static void ReplaceHandler()
{
File.Open(
" test.txt " , FileMode.Open);
Console.WriteLine(
" 發生異常,不執行該指令 " );
}

private static void NoThrowException()
{
int i = Int32.Parse( " A " );
Console.WriteLine(
" 發生異常,不執行該指令 " );
}
}
}
 

 

13.   運行結果:


 

 

打開工程目錄下的rolling.log文件:


 

OK,到此爲止,咱們將四個問題都解決了.

 

 

測試程序能夠點擊這裏下載\(^^ \)

相關文章
相關標籤/搜索