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#的委托机制。

    ///


    /// 要执行的方法
    ///

    public delegate void MethodToDo();
    ///
    /// 处理错误的方法
    ///

    /// 错误对象
    public delegate void MethodDealException(Exception e);

    ///


    /// 将方法用try - catch块包围
    ///

    public class TryCatch
    {
        private event MethodToDo methodToDo;
        private event MethodDealException methodDealException;

        ///


        /// 将方法用try - catch块包围
        ///

        /// 要执行的方法
        public TryCatch(MethodToDo methodToDo)
        {
            this.methodToDo += methodToDo;
            Do();
        }

        ///


        /// 将方法用try - catch块包围
        ///

        /// 要执行的方法
        /// 处理错误的方法
        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);


你可能感兴趣的:(.NET技术,C#提高)