在方法上贴上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
感谢这位兄弟付出。测试源码下载

最新文章

  1. 使用junit测试用例
  2. 菜鸟学Linux命令:端口查看和操作命令
  3. Sypder上手
  4. Android图表
  5. Pop Sequence (栈)
  6. 【最大流之sap】【HDU1532】模板题
  7. /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15&#39; not found,解压rpm包
  8. 微信公众平台企业号验证接口、回调 PHP版
  9. 图的连通性:有向图强连通分量-Tarjan算法
  10. PropertyGrid自定义控件
  11. SSM简明教程:简单的十步教你搭建人生第一个SSM框架[ SSM框架整合教程(Spring+SpringMVC+MyBatis) ]
  12. 实现全屏轮播,并且轮播div中的文字盒子一直自动垂直居中
  13. hdu2669与hdu1576(扩展欧几里德)
  14. SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别
  15. 深入学习c++(虚函数遇到析构函数就退化了)
  16. Android 模仿QQ空间风格的 UI
  17. Linux 防火墙命令的操作命令CentOS
  18. 两种JS事件流
  19. New Game! (最短路+建图)
  20. Windows命令行参数(不断更新)

热门文章

  1. 二维数组模拟实现酒店管理系统-java
  2. logback的使用和logback.xml详解
  3. HtmlHelper总结
  4. Hadoop问题:chmod 0700 of directory /var/lib/apt/lists/
  5. vue学习笔记(四)——Vue实例以及生命周期
  6. CCF系列之数列分段(201509-1)
  7. dotnetcore vue+elementUI 前后端分离架二(后端篇)
  8. video.js不能控制本地视频或者音频播放时长
  9. 红米 Note3 (kenzo)刷入 Lineage OS
  10. Linxu指令--date,cal