PostSharp AOP编程:1.基于PostSharp的AOP日志记录和异常捕捉【附带源码】-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

PostSharp AOP编程:1.基于PostSharp的AOP日志记录和异常捕捉【附带源码】

简介:
+关注继续查看

   AOP(基于切面编程):它是对业务逻辑的分离,使各个业务直接的耦合变低,比如在传统的OOP编程中将日志记录、异常处理、权限管理等方面剥离出来。在今后的维护过程中,对其改变日志记录、异常处理、权限管理方法的时候,不用去改变主业务流程逻辑代码。提高开发效率。

        PostSharp采用特性的方式来对编译后的主业务流程方法逻辑横向静态注入截取数据。下面我们将以一个实例来演示如何使用PostSharp实现AOP进行日志记录和异常处理。

        首先需要安装PostSharp 2.1.4.1免费版本,这个版本只是功能相对较少,可商用,能够满足日志记录和异常截取的要求。点击PostSharp-2.1.4.1 下载.

        

        然后新建一个控制台项目并将PostSharp.dll引入该项目中。编写一个截取日志的特性LogsAttributes.cs。

复制代码
    //日志特性截取类
[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));

}
}
复制代码

        再看看当出现异常时通过try{} catch{}处理异常,ExceptionAttribute.cs类捕捉并且处理异常:

复制代码
    //截取异常并且处理异常
[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()));
}
}
}
复制代码

        在客户端编写两个方法来测试PostSharp是否静态注入并且捕获到相关信息,代码如下:

复制代码
    class Program
{
static void Main(string[] args)
{
Add(3, 5);
Console.WriteLine("-------------------------------------------------------");
Subject(5, 12);
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;
}
}
复制代码

        下面是项目运行效果,如需源码请点击 PostSharpAOP.zip 下载。


本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/11/21/2248436.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot-18-之AOP+log4j 记录访问请求信息
org.springframework.boot spring-boot-starter-aop log4j log4j 1.
1067 0
[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼、百战不殆)       继上三篇:ORACLE PL/SQL编程之八:把触发器说透               ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)               [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)  得到了大家的强力支持与建议,万分感谢。
758 0
k8s与日志--journalbeat源码解读
前言 对于日志系统的重要性不言而喻,参照沪江的一篇关于日志系统的介绍,基本上日志数据在以下几方面具有非常重要的作用: 数据查找:通过检索日志信息,定位相应的 bug ,找出解决方案 服务诊断:通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态 数据分析:可以做进一步的数据分析,比如根据请求中的课程 id ,找出 TOP10 用户感兴趣课程 日志+大数据+AI的确有很多想象空间。
1226 0
Spring-Aop处理记录日志
AOP的几种通知类型: 1,前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行 配置文件中使用 &lt;aop:before&gt;进行声明 注解使用 @Before 进行声明 2,后置通知(After advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
2477 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志
第 30 章 可靠性和预写式日志 目录 30.1. 可靠性 30.2. 预写式日志(WAL) 30.3. 异步提交 30.4. WAL配置 30.5. WAL内部 本章解释预写式日志如何用于获得有效的、可靠的操作。
873 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.2. 预写式日志(WAL)
30.2. 预写式日志(WAL) 预写式日志(WAL)是保证数据完整性的一种标准方法。对其详尽的描述几乎可以在所有(如果不是全部)有关事务处理的书中找到。简单来说,WAL的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被写入,即在描述这些改变的日志记录被刷到持久存储以后。
1133 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载