溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PostSharp AOP編程:4.PostSharp的OnExceptionAspect類基本組成

發(fā)布時(shí)間:2020-06-25 03:55:27 來(lái)源:網(wǎng)絡(luò) 閱讀:419 作者:程興亮 欄目:編程語(yǔ)言

        在PostSharp中得OnExceptionAspect類是針對(duì)異常的消息截取。繼承于它的特性將可以在發(fā)生異常的時(shí)候?qū)Ψ椒w內(nèi)的異常截取,并且做出動(dòng)作,看是否停止本程序運(yùn)行,還是忽略異常。

        這個(gè)類里面有兩個(gè)主要的函數(shù)可以重載分別是OnException(MethodExecutionArgs args)、GetExceptionType(System.Reflection.MethodBase targetMethod)。他們分別意義如下:

        OnException(MethodExecutionArgs args):當(dāng)發(fā)生異常時(shí)截取異常發(fā)生的位置(在哪個(gè)命名空間?哪個(gè)類?哪個(gè)方法?)、異常類型、異常消息等信息,并且可以異常將如何處理。

        GetExceptionType(System.Reflection.MethodBase targetMethod):設(shè)置需要攔截的異常類型,比如設(shè)置需要攔截參數(shù)異常,那么其他的異常類型發(fā)生時(shí)將不會(huì)被此特性所攔截。

        首先我們編寫(xiě)一個(gè)繼承于OnExceptionAspect類的特性,并且重載相關(guān)函數(shù)如下代碼:

 

  1. [Serializable
  2. public class ExceptionAttribute : OnExceptionAspect 
  3.     //當(dāng)異常發(fā)生時(shí) 
  4.     public override void OnException(MethodExecutionArgs args) 
  5.     { 
  6.         Console.WriteLine("______________________________________________________________________________"); 
  7.         Console.WriteLine("異常時(shí)間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ; 
  8.         Console.WriteLine("異常類名:" + args.Method.DeclaringType.FullName); 
  9.         Console.WriteLine("異常方法:" + args.Method.Name); 
  10.         Console.WriteLine("異常信息:" + args.Exception.ToString()); 
  11.         args.FlowBehavior = FlowBehavior.Continue
  12.     } 
  13.  
  14.     //需要攔截的異常類型為ArgumentException 
  15.     public override Type GetExceptionType(System.Reflection.MethodBase targetMethod) 
  16.     { 
  17.         return typeof(ArgumentException); 
  18.     } 

        其次我們編寫(xiě)一個(gè)目標(biāo)類,此類中含有一個(gè)方法,方法內(nèi)拋出參數(shù)異常,并為其添加Exception的特性,如以下代碼所示:

 

  1. class People 
  2.     [Exception] 
  3.     public void Test(int a, int b) 
  4.     { 
  5.         throw new ArgumentException("這里有參數(shù)錯(cuò)誤,請(qǐng)檢查參數(shù)"); 
  6.     } 

        再編寫(xiě)一個(gè)對(duì)比目標(biāo)類,要實(shí)現(xiàn)同樣的效果需要遠(yuǎn)遠(yuǎn)多于我們使用PostSharp的情況,而且會(huì)讓我們的邏輯處理更為復(fù)雜和麻煩,如下代碼所示:

 

  1. class Pelple1 
  2.     public void Test(int a, int b) 
  3.     { 
  4.         try  
  5.         { 
  6.             throw new ArgumentException("這里有參數(shù)錯(cuò)誤,請(qǐng)檢查參數(shù)"); 
  7.         } 
  8.         catch (ArgumentException args) 
  9.         { 
  10.             Console.WriteLine("______________________________________________________________________________"); 
  11.             Console.WriteLine("異常時(shí)間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ; 
  12.             Console.WriteLine("異常信息:" + args.ToString());         
  13.         } 
  14.     } 

        最后我們?cè)诳蛻舳顺跏蓟疨eople類并且引用方法如下代碼:

 

  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         People p = new People(); 
  5.         p.Test(3,5); 
  6.  
  7.         Pelple1 p1 = new Pelple1(); 
  8.         p1.Test(3, 5); 
  9.         Console.ReadLine(); 
  10.     } 

        如需源碼請(qǐng)點(diǎn)擊 PostSharpOnExceptionAspect.zip  下載,運(yùn)行效果如下圖:

PostSharp AOP編程:4.PostSharp的OnExceptionAspect類基本組成

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI