C# 错误统一捕捉处理新方式

http://lwbpeter.blog.163.com/blog/static/38508211201007105437493/


近段时间做的一个三层架构+WCF+NHibernate的C/S项目,项目中的错误捕捉处理一直都很头疼,

今天终于找到了一个可以接受的方案。

首先,在前台捕捉所有未处理线程的错误做统一处理。

详见:WinForm程序中未处理异常的解决方法

其次,是WCF服务后台的错误处理,在错误契约把错误回发前台之前,把错误信息记录到错误日志。

可参见:

WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)

 最后,还需要一种简单灵活的错误处理方式,既不用手写try-catch块,又能对错误进行统一的处理。

按照设想,应该做到的功能是在要用try-catch块把要执行的方法包住。网上漫天找,什么C#AOP的也去看了,

都不是很理想,

 想了很久,突然出现了一丝灵光,于是,便有了以下代码:

原理是C#的委托机制。

    /// <summary>
    /// 要执行的方法
    /// </summary>
    public delegate void MethodToDo();
    /// <summary>
    /// 处理错误的方法
    /// </summary>
    /// <param name="e">错误对象</param>
    public delegate void MethodDealException(Exception e);

    /// <summary>
    /// 将方法用try - catch块包围
    /// </summary>
    public class TryCatch
    {
        private event MethodToDo methodToDo;
        private event MethodDealException methodDealException;

        /// <summary>
        /// 将方法用try - catch块包围
        /// </summary>
        /// <param name="methodToDo">要执行的方法</param>
        public TryCatch(MethodToDo methodToDo)
        {
            this.methodToDo += methodToDo;
            Do();
        }

        /// <summary>
        /// 将方法用try - catch块包围
        /// </summary>
        /// <param name="methodToDo">要执行的方法</param>
        /// <param name="methodDealException">处理错误的方法</param>
        public TryCatch(MethodToDo methodToDo, MethodDealException methodDealException)
        {
            this.methodToDo += methodToDo;
            this.methodDealException += methodDealException;
            Do();
        }

        public void Do()
        {
            if (this.methodToDo != null)
            {
                //获得委托列表
                Delegate[] arr = this.methodToDo.GetInvocationList();               
                foreach (Delegate d in arr)
                {
                    try
                    {
                        MethodToDo method = (MethodToDo)d;
                        //同步执行方法
                        method.Invoke();
                    }
                    catch (Exception ex)
                    {
                        if (this.methodDealException != null) //执行自定义错误处理方法
                        {
                            Delegate[] err = this.methodToDo.GetInvocationList();
                            foreach (Delegate de in err)
                            {
                                MethodDealException me = (MethodDealException)de;
                                me.Invoke(ex);
                            }
                        }
                        else //执行统一的错误处理方法
                        {
                            throw ex;
                        }
                    }
                }
            }
        }
    }

以上这个错误处理类可以这样调用:

先声明要执行的方法,如:

        private void cal()
        {
             int i = calInt("a");
        }

        private int calInt(string p)
        {
            return int.Parse(p);
        }

然后便可以调用处理类来执行了:

new TryCatch(cal);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值