如何在方法上贴上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
感谢这位兄弟付出。测试源码下载
如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求的更多相关文章
- [C#]Attribute特性(2)——方法的特性及特性参数
上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...
- [C#]Attribute特性(3)——AttributeUsage特性和特性标识符
相关文章 [C#]Attribute特性 [C#]Attribute特性(2)——方法的特性及特性参数 AttributeUsage特性 除了可以定制自己的特性来注释常用的C#类型外,您可以用At ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- 【pycharm】pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法
pycharm上安装tensorflow,报错:AttributeError: module 'pip' has no attribute 'main' 解决方法 解决方法: 在pycharm的安装目 ...
- 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结
1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”>,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文将针对上篇中提到的特性,结合我们的实践经 ...
- ueditor 1.4.3 gbk asp 上传中文乱码 终极解决方法 ie6 ie8 也适用
[摘要:百度编纂器1.43 gbk asp 题目 1.firefox3.0下 单图上传 面没有了 面多图上传 中央的蓝色按钮(即 面击挑选图片)没有表现(附件上传出那个题目) 没有晓得我的水狐吃翔了 ...
- JavaScript 使用 sort() 方法从数值上对数组进行排序
使用 sort() 方法从数值上对数组进行排序. <html> <body> <script type="text/javascript"> f ...
- PHP设置图片文件上传大小的具体实现方法
PHP默认的上传限定是最大2M,想上传超过此设定的文件,需要调整PHP.apache等的一些参数 我们简要介绍一下PHP文件上传涉及到的一些参数: •file_uploads :是否允许通过HTTP上 ...
随机推荐
- Java入门篇(四)——数组
上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...
- UEP-find查询
实体类: @Entity @Table(name = "xxxxx") public class WzInitializeStoreInfo extends EntityBean{ ...
- HDU 2412 Farm Irrigation
题目: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
- 番外篇--Moddule Zero多租户管理
番外篇--Moddule Zero多租户管理 2.1.1 关于多租户 强烈建议阅读这个文件前阅读多租户文档. 2.1.2 启用多租户 ASP.NET Boilerplate和module-zero可以 ...
- 算法-java代码实现堆排序
堆排序 第7节 堆排序练习题 对于一个int数组,请编写一个堆排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2 ...
- removeClass()
定义和用法 removeClass() 方法从被选元素移除一个或多个类. 注释:如果没有规定参数,则该方法将从被选元素中删除所有类. 语法 $(selector).removeClass(class) ...
- 小白的Python之路 day5 logging模块
logging模块的特点及用法 一.概述 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你 ...
- IOS开发之纯代码界面--基本控件使用篇 ┊
http://www.cocoachina.com/bbs/read.php?tid=131516
- ubuntu 修复 could not open file '/etc/apt/sources.list'
问题描述:could not open file '/etc/apt/sources.list' 问题分析:软件源被清空了,也就是 /etc/apt/sources.list 被删除了 解决问题:1. ...
- MyBatis 查询示例
环境搭建 数据库schema 1)datasource.xml配置 <?xml version="1.0" encoding="UTF-8"?> & ...