PostSharp AOP编程:4.PostSharp的OnExceptionAspect类基本组成

简介:

在PostSharp中得OnExceptionAspect类是针对异常的消息截取。继承于它的特性将可以在发生异常的时候对方法体内的异常截取,并且做出动作,看是否停止本程序运行,还是忽略异常。

        这个类里面有两个主要的函数可以重载分别是OnException(MethodExecutionArgs args)、GetExceptionType(System.Reflection.MethodBase targetMethod)。他们分别意义如下:

        OnException(MethodExecutionArgs args):当发生异常时截取异常发生的位置(在哪个命名空间?哪个类?哪个方法?)、异常类型、异常消息等信息,并且可以异常将如何处理。

        GetExceptionType(System.Reflection.MethodBase targetMethod):设置需要拦截的异常类型,比如设置需要拦截参数异常,那么其他的异常类型发生时将不会被此特性所拦截。

        首先我们编写一个继承于OnExceptionAspect类的特性,并且重载相关函数如下代码:

 

 
  1. [Serializable
  2. public class ExceptionAttribute : OnExceptionAspect 
  3.     //当异常发生时 
  4.     public override void OnException(MethodExecutionArgs args) 
  5.     { 
  6.         Console.WriteLine("______________________________________________________________________________"); 
  7.         Console.WriteLine("异常时间:" + 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.     } 

        其次我们编写一个目标类,此类中含有一个方法,方法内抛出参数异常,并为其添加Exception的特性,如以下代码所示:

 

 
  1. class People 
  2.     [Exception] 
  3.     public void Test(int a, int b) 
  4.     { 
  5.         throw new ArgumentException("这里有参数错误,请检查参数"); 
  6.     } 

        再编写一个对比目标类,要实现同样的效果需要远远多于我们使用PostSharp的情况,而且会让我们的逻辑处理更为复杂和麻烦,如下代码所示:

 

 
  1. class Pelple1 
  2.     public void Test(int a, int b) 
  3.     { 
  4.         try  
  5.         { 
  6.             throw new ArgumentException("这里有参数错误,请检查参数"); 
  7.         } 
  8.         catch (ArgumentException args) 
  9.         { 
  10.             Console.WriteLine("______________________________________________________________________________"); 
  11.             Console.WriteLine("异常时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ; 
  12.             Console.WriteLine("异常信息:" + args.ToString());         
  13.         } 
  14.     } 

        最后我们在客户端初始化People类并且引用方法如下代码:

 

 
  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.     } 

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



本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827098

相关文章
|
1月前
|
Java Maven 数据安全/隐私保护
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
35 1
|
23天前
|
前端开发 Java 数据库
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
|
23天前
|
XML Java 数据格式
技术好文:Spring基础篇——AOP切面编程
技术好文:Spring基础篇——AOP切面编程
|
1月前
|
缓存 监控 安全
AOP则关注如何将那些影响多个类的功能模块化
AOP则关注如何将那些影响多个类的功能模块化
|
2月前
|
XML 监控 安全
Spring特性之一——AOP面向切面编程
Spring特性之一——AOP面向切面编程
44 1
|
12天前
|
监控 安全 Java
Java中的AOP编程实践与应用场景
Java中的AOP编程实践与应用场景
|
19天前
|
XML 监控 Java
Java中的AOP编程:AspectJ与Spring AOP的应用
Java中的AOP编程:AspectJ与Spring AOP的应用
|
1月前
|
XML Java 程序员
Java一分钟之-AOP:面向切面编程
【6月更文挑战第13天】Java中的AOP允许程序员定义切面,将日志、事务等通用功能与业务逻辑解耦。切面包括通知(Advice,如前置、后置等)和切入点(Pointcut,定义执行点)。Spring框架通过代理和@AspectJ注解支持AOP。常见问题包括代理对象理解错误、切入点表达式错误、环绕通知处理不当和配置遗漏。理解和实践中,AOP能提升代码可维护性和可扩展性。
39 5
|
2月前
|
Java 开发者 Spring
面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程
面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程
39 1
面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程
|
16天前
|
安全 Java C++
Java中的AOP编程详解
Java中的AOP编程详解