科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件匿名委托简单模拟AOP做异常和日志处理

匿名委托简单模拟AOP做异常和日志处理

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这两天写 ASP.NET 写晕了,老想偷点懒。由于在后台的代码里几乎每个方法里都要 try..catch 这么来一遍,感觉很烦琐。

作者:中国IT实验室 来源:中国IT实验室 2007年8月31日

关键字: 日志 异常 AOP

  • 评论
  • 分享微博
  • 分享邮件
这两天写 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. 查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章