zoukankan      html  css  js  c++  java
  • 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
    {
    public void Test(int a, int b)
    {
    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();
    }
    }

            如需源码请点击 PostSharpOnExceptionAspect.zip  下载,运行效果如下图:

  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2305724.html
Copyright © 2011-2022 走看看