天天看點

PostSharp AOP程式設計:4.PostSharp的OnExceptionAspect類基本組成

在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

繼續閱讀