如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求
在方法上贴上attribute(特性)捕捉方法的异常,其实这么做也是为了在项目中不会大量使用try…cacth这样的语句,同时使我们的代码看起来更简洁,更直观,将逻辑业务分离使得后期维护方便。这里我们需要AOP方面的知识。(自行百度解决这知识)
AOP(基于切面编程):它是对业务逻辑的分离,使各个业务直接的耦合变低,比如在传统的OOP编程中将日志记录、异常处理、权限管理等方面剥离出来。在今后的维护过程中,对其改变日志记录、异常处理、权限管理方法的时候,不用去改变主业务流程逻辑代码。提高开发效率。
PostSharp采用特性的方式来对编译后的主业务流程方法逻辑横向静态注入截取数据。下面我们将以一个实例来演示如何使用PostSharp实现AOP进行日志记录和异常处理。
首先需要安装PostSharp 2.1.4.1免费版本,这个版本只是功能相对较少,可商用,但能够满足日志记录和异常截取的要求。点击下载
//截取方法异常并且处理异常 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] class ExceptionAttribute:MethodInterceptionAspect { //调用本函数时截取异常 public override void OnInvoke(MethodInterceptionArgs args) { try { base.OnInvoke(args); } catch(Exception ex) { Console.WriteLine(string.Format("此方法异常信息是:{0}", ex.ToString())); } } }
//日志特性截取类 [Serializable] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] class LogsAttribute:OnMethodBoundaryAspect { /// <summary> /// 入口参数信息 /// </summary> public string EntryText { get; set; } /// <summary> /// 出口参数信息 /// </summary> public string ExitText { get; set; } /// <summary> /// 异常信息 /// </summary> public string ExceptionText { get; set; } //进入方法时输出方法的输入参数 public override void OnEntry(MethodExecutionArgs eventArgs) { Arguments arguments = eventArgs.Arguments; StringBuilder sb = new StringBuilder(); ParameterInfo[] parameters = eventArgs.Method.GetParameters(); for (int i = 0; arguments != null && i < arguments.Count; i++) { //进入的参数的值 sb.Append( parameters[i].Name + "=" + arguments[i] + " "); } string message = string.Format("{0}.{1} Method. The Entry Arg Is:{2}", eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, sb.ToString()); Console.WriteLine(message); } //退出方法时的方法返回值 public override void OnExit(MethodExecutionArgs eventArgs) { Console.WriteLine(string.Format("{0}.{1} Method. The Result Is:{2}", eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.ReturnValue.ToString())); } //方法发生异常时记录异常信息--这里可截获我要的方法异常信息 public override void OnException(MethodExecutionArgs eventArgs) { Console.WriteLine(string.Format("{0}.{1} Method. The Exception Is:{2}", eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.Exception.Message)); } }
项目中我们的使用方式,通常只需要捕捉方法的异常信息就行
static void Main(string[] args) { Add(3, 5); Console.WriteLine("-------------------------------------------------------"); Subject(5, 12); Subject22(4, 0); Console.ReadLine(); } //此函数让我们看其输入参数和返回值的日志记录 [Logs] [Exception] public static int Add(int a, int b) { return a + b; } //此函数看我们的异常通过自定义Exception特性记录下来 [Logs] [Exception] public static int Subject(int a, int b) { throw new ArgumentException("减法出现异常,需要处理"); return a - b; } //此函数获取方法的异常信息---通常我们用这个就可以了。 [Exception] public static int Subject22(int a, int b) { throw new ArgumentException("尝试除以0"); return a/b; }
项目中我们使用种方式就足够了,只需要贴在方法上的特性能捕捉到异常并做处理就OK了。 //此函数获取方法的异常信息---通常我们用这个就可以了。 [Exception] public static int Subject22(int a, int b) { throw new ArgumentException("尝试除以0"); return a/b; }
本文来自:http://www.cnblogs.com/chengxingliang/archive/2011/11/21/2248436.html
感谢这位兄弟付出。测试源码下载
每天进步点点,365天就是进步一大步,人生就得以成长。年轻你无权选择停止,要学会奋斗。每天多一点奋斗,每天多一点反省,每天多一点自律。每天少一点自责,每天少一点懊悔,点点滴滴中成长。