在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理
2006-12-23 12:16
561 查看
[align=left]这两天写 ASP.NET 写晕了,老想偷点懒。由于在后台的代码里几乎每个方法里都要 try..catch 这么来一遍,感觉很烦琐。又联想到 AOP, 但 AOP 的做法相对比较复杂,做法也很多。比如用 Dynamic Proxy, Attribute, 或者 Emit 等。我忽然联想到了 C# 2.0 的新特性匿名委托,觉得这个虽然丑一点。。。不过其实也可以比较轻量级的简单模拟 AOP 的效果:[/align]
[align=left] [/align]
[align=left]// asp.net 里面强制做一个页面基类的要求是不过分的。。。
public partial class TestLogger: PageBase {
protected void Page_Load(object sender, EventArgs e) {
// 这个方法实现在页面基类里面,可以往里面实现通用的异常处理,日志逻辑等。
TryDo(
// 这个里面干实际的事情
delegate() {
int a = 1;
int b = 0;
int c = a / b;
},
// 这是一个可选的异常处理,如果传递一个 null 就会干脆忽略异常
delegate() {
Response.Write("Sorry, 发生了一个错误。");
}
);
}
}
在页面基类里面的实现代码就很简单了,也可以方便的统一管理。这里我假定仅仅简单的用 log4net 来对异常做日志记录:
using System;
using System.Web.UI;
using log4net;[/align]
[align=left] [/align]
[align=left]namespace SomeNamespace {
// 定义一个简单的委托用于传递匿名委托
public delegate void MyAction();
// 定义页面基类
public class PageBase : Page {
protected ILog logger;[/align]
[align=left] [/align]
[align=left] // 页面基类里面集中处理所有异常处理逻辑
protected void TryDo(MyAction doHandler, MyAction exceptHandler) {
try {
// 干点儿实际的事情
doHandler();
} catch (Exception ex) {
// 简单的记录异常
logger.Error(ex);
// 其他一些处理
// 。。。[/align]
[align=left] [/align]
[align=left] // 调用自定义的异常处理,这里没有回传 Exception 的具体信息。因为反正没有必要对用户显示了。。。
if (exceptHandler != null)
exceptHandler();
}
}[/align]
[align=left] [/align]
[align=left] protected override void OnInit(EventArgs e) {
// 初始化 logger. 正好这里 GetType() 可以取到子类的实际类型
logger = LogManager.GetLogger(this.GetType());[/align]
[align=left] [/align]
[align=left] base.OnInit(e);
}
}
}
好了,先写到这里。这只是我的一个简单想法。目的在轻量级的实现异常或日志的集中管理。当然这个和完整的 AOP 概念是没法比的,不过话说回来,好像目前在 .NET 中还没有很完美的 AOP framework.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_exception_handling.html[/align]
[align=left]
参考示例 : http://www.5h6.com/article/27977.html[/align]
相关文章推荐
- 在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理
- 在 ASP.NET 中用匿名委托简单模拟 AOP 做异常和日志处理
- asp.net中的日志添加和未处理异常的记录
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- ASP.NET MVC 全局异常处理与异常日志
- ASP.NET Core 异常处理与日志记录
- ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面
- 说说asp.net中的异常处理和日志追踪
- Asp.Net : 捕捉和记录网站中出现的所有未处理错误,抛出详细的页面来源和访问ip,调用的接口方法及异常实例(记事本日志,系统日志及数据库日志)
- 使用Spring.NET统一ASP.NET异常处理并记录日志
- asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程
- Asp.net Web Applicatoin实现自定义HttpModule拦截异常处理
- ASP.NET中的事务处理和异常处理
- Asp.net 2.0的异常处理需要考虑的问题
- Asp.net 2.0的异常处理需要考虑的问题
- Log4Net异常日志记录在asp.net mvc3.0的应用
- 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL
- 通过实例模拟ASP.NET MVC的Model绑定机制:简单类型+复杂类型
- 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现
- Scott Mitchell 的ASP.NET 2.0数据教程之三十八:: 处理BLL和DAL的异常