您好,登錄后才能下訂單哦!
在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ù)如下代碼:
- [Serializable]
- public class ExceptionAttribute : OnExceptionAspect
- {
- //當(dāng)異常發(fā)生時(shí)
- public override void OnException(MethodExecutionArgs args)
- {
- Console.WriteLine("______________________________________________________________________________");
- Console.WriteLine("異常時(shí)間:" + 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);
- }
- }
其次我們編寫(xiě)一個(gè)目標(biāo)類,此類中含有一個(gè)方法,方法內(nèi)拋出參數(shù)異常,并為其添加Exception的特性,如以下代碼所示:
- class People
- {
- [Exception]
- public void Test(int a, int b)
- {
- throw new ArgumentException("這里有參數(shù)錯(cuò)誤,請(qǐng)檢查參數(shù)");
- }
- }
再編寫(xiě)一個(gè)對(duì)比目標(biāo)類,要實(shí)現(xiàn)同樣的效果需要遠(yuǎn)遠(yuǎn)多于我們使用PostSharp的情況,而且會(huì)讓我們的邏輯處理更為復(fù)雜和麻煩,如下代碼所示:
- class Pelple1
- {
- public void Test(int a, int b)
- {
- try
- {
- throw new ArgumentException("這里有參數(shù)錯(cuò)誤,請(qǐng)檢查參數(shù)");
- }
- catch (ArgumentException args)
- {
- Console.WriteLine("______________________________________________________________________________");
- Console.WriteLine("異常時(shí)間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ;
- Console.WriteLine("異常信息:" + args.ToString());
- }
- }
- }
最后我們?cè)诳蛻舳顺跏蓟疨eople類并且引用方法如下代碼:
- 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();
- }
- }
如需源碼請(qǐng)點(diǎn)擊 PostSharpOnExceptionAspect.zip 下載,運(yùn)行效果如下圖:
免責(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)容。