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

如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求的更多相关文章

  1. [C#]Attribute特性(2)——方法的特性及特性参数

    上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...

  2. [C#]Attribute特性(3)——AttributeUsage特性和特性标识符

    相关文章   [C#]Attribute特性 [C#]Attribute特性(2)——方法的特性及特性参数 AttributeUsage特性 除了可以定制自己的特性来注释常用的C#类型外,您可以用At ...

  3. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  4. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  5. 【pycharm】pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法

    pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法 解决方法: 在pycharm的安装目 ...

  6. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”>,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文将针对上篇中提到的特性,结合我们的实践经 ...

  7. ueditor 1.4.3 gbk asp 上传中文乱码 终极解决方法 ie6 ie8 也适用

    [摘要:百度编纂器1.43 gbk asp 题目 1.firefox3.0下 单图上传 面没有了 面多图上传 中央的蓝色按钮(即 面击挑选图片)没有表现(附件上传出那个题目) 没有晓得我的水狐吃翔了 ...

  8. JavaScript 使用 sort() 方法从数值上对数组进行排序

    使用 sort() 方法从数值上对数组进行排序. <html> <body> <script type="text/javascript"> f ...

  9. PHP设置图片文件上传大小的具体实现方法

    PHP默认的上传限定是最大2M,想上传超过此设定的文件,需要调整PHP.apache等的一些参数 我们简要介绍一下PHP文件上传涉及到的一些参数: •file_uploads :是否允许通过HTTP上 ...

随机推荐

  1. [最直白版]一步一步教你用VMware Workstation12安装Ubuntu 16.04和VMware Tools的教程

    [最直白版]Win10下一步一步教你用 VMware Workstation12安装Ubuntu 16.04和VMware Tools的教程 安装过程中使用的软件(要保证电脑里面有下列三个东西): 1 ...

  2. v-for并判断当前元素是否选中:$set实现响应添加属性

    前言 一直纠结着使用v-for进行列表渲染时如何为当前的元素添加是否选中的标识. 1.v-for进行列表渲染 <div class="lists"> <ul> ...

  3. dig命令

      dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具.它执行 DNS 搜索,显示从受请求的域名服务器返回的答复.多数 DNS 管理员利用 dig 作为 DNS 问题的故障诊断, ...

  4. 怎么用Sublime查找替换整个文件夹下的所有文件内容?

    https://segmentfault.com/q/1010000003946095 工程目录下有很多图片路径要修改,很多散落在各个文件夹. 2015年11月03日提问 评论 邀请回答 编辑 4个回 ...

  5. oracle11g安装教程(注意事项及图文教程)

    Oracle安装与重装注意事项 1.安装oracle(**) 注意:安装Oracle之前确定自己的主机(计算机)名要保证计算机名是英文的. 1.oracle的安装文件不要放在含有中文的目录当中,如:d ...

  6. vue学习笔记(三)——目录结构介绍

    1.初始目录结构如下: 2.目录结构介绍 目录/文件 说明 build 最终发布的代码存放位置. config 配置目录,包括端口号等.我们初学可以使用默认的. node_modules npm 加载 ...

  7. 爬虫利器BeautifulSoup模块使用

    一.简介 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,同时应用场景也是非常丰富,你可以使用 ...

  8. WKWebView--JS调用OC的方法

    WKWebView---JS调用OC方法 一.使用的协议进行简单的介绍 1.在WKWebView中OC和JS交互也非常简单,WebKit的库中有个代理WKScriptMessageHandler就是专 ...

  9. sudo 无效命令

    mac系统中由于不小心修改了/etc/sudoers下的权限为777,故而sudo命令不能使用. 解决办法 1.重新启动mac并且按command+s进入单用户界面 2.此时默认的系统状态是只读状态, ...

  10. linux_http协议

    什么是http协议? 超文本传输协议 最流行www服务,是http协议的实现 ssh,nfs,rsync客户端(Client)和服务端(Server),C/S架构,局域网内部用,胖客户端 http协议 ...