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  下载,运行效果如下图:

  • 相关阅读:
    Docker 部署 Nginx
    Docker 安装 Redis
    linux shell "2>&1"
    定时备份docker mysql
    SpringBoot 中拦截器和过滤器的使用
    SpringBoot WebMvcConfigurer
    springboot自定义参数解析HandlerMethodArgumentResolver
    mysql在linux下查看my.cnf位置的方法
    Linux下设置mysql允许远程连接
    Android项目实战(六十):修改项目包名
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2305724.html
Copyright © 2011-2022 走看看