在PostSharp中得OnExceptionAspect類是針對異常的消息截取。繼承于它的特性将可以在發生異常的時候對方法體内的異常截取,并且做出動作,看是否停止本程式運作,還是忽略異常。
這個類裡面有兩個主要的函數可以重載分别是OnException(MethodExecutionArgs args)、GetExceptionType(System.Reflection.MethodBase targetMethod)。他們分别意義如下:
OnException(MethodExecutionArgs args):當發生異常時截取異常發生的位置(在哪個命名空間?哪個類?哪個方法?)、異常類型、異常消息等資訊,并且可以異常将如何處理。
GetExceptionType(System.Reflection.MethodBase targetMethod):設定需要攔截的異常類型,比如設定需要攔截參數異常,那麼其他的異常類型發生時将不會被此特性所攔截。
首先我們編寫一個繼承于OnExceptionAspect類的特性,并且重載相關函數如下代碼:
[Serializable]
public class ExceptionAttribute : OnExceptionAspect
{
//當異常發生時
public override void OnException(MethodExecutionArgs args)
{
Console.WriteLine("______________________________________________________________________________");
Console.WriteLine("異常時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ;
Console.WriteLine("異常類名:" + args.Method.DeclaringType.FullName);
Console.WriteLine("異常方法:" + args.Method.Name);
Console.WriteLine("異常資訊:" + args.Exception.ToString());
args.FlowBehavior = FlowBehavior.Continue;
}
//需要攔截的異常類型為ArgumentException
public override Type GetExceptionType(System.Reflection.MethodBase targetMethod)
return typeof(ArgumentException);
}
其次我們編寫一個目标類,此類中含有一個方法,方法内抛出參數異常,并為其添加Exception的特性,如以下代碼所示:
class People
[Exception]
public void Test(int a, int b)
throw new ArgumentException("這裡有參數錯誤,請檢查參數");
再編寫一個對比目标類,要實作同樣的效果需要遠遠多于我們使用PostSharp的情況,而且會讓我們的邏輯處理更為複雜和麻煩,如下代碼所示:
class Pelple1
try
{
throw new ArgumentException("這裡有參數錯誤,請檢查參數");
}
catch (ArgumentException args)
Console.WriteLine("______________________________________________________________________________");
Console.WriteLine("異常時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ;
Console.WriteLine("異常資訊:" + args.ToString());
最後我們在用戶端初始化People類并且引用方法如下代碼:
class Program
static void Main(string[] args)
People p = new People();
p.Test(3,5);
Pelple1 p1 = new Pelple1();
p1.Test(3, 5);
Console.ReadLine();
<a target="_blank" href="http://blog.51cto.com/attachment/201204/180040183.jpg"></a>
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/827098