这两天写 asp.net 写晕了,老想偷点懒。由于在后台的代码里几乎每个方法里都要 try..catch 这么来一遍,感觉很烦琐。又联想到 aop, 但 aop 的做法相对比较复杂,做法也很多。比如用 dynamic proxy, attribute, 或者 emit 等。我忽然联想到了 c# 2.0 的新特性匿名委托,觉得这个虽然丑一点。。。不过其实也可以比较轻量级的简单模拟 aop 的效果:
// 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;
namespace somenamespace {
// 定义一个简单的委托用于传递匿名委托
public delegate void myaction();
// 定义页面基类
public class pagebase : page {
protected ilog logger;
// 页面基类里面集中处理所有异常处理逻辑
protected void trydo(myaction dohandler, myaction excepthandler) {
try {
// 干点儿实际的事情
dohandler();
} catch (exception ex) {
// 简单的记录异常
logger.error(ex);
// 其他一些处理
// 。。。
// 调用自定义的异常处理,这里没有回传 exception 的具体信息。因为反正没有必要对用户显示了。。。
if (excepthandler != null)
excepthandler();
}
}
protected override void oninit(eventargs e) {
// 初始化 logger. 正好这里 gettype() 可以取到子类的实际类型
logger = logmanager.getlogger(this.gettype());
base.oninit(e);
}
}
}
好了,先写到这里。这只是我的一个简单想法。目的在轻量级的实现异常或日志的集中管理。当然这个和完整的 aop 概念是没法比的,不过话说回来,好像目前在 .net 中还没有很完美的 aop framework.
新闻热点
疑难解答
图片精选