zoukankan      html  css  js  c++  java
  • C# 如何处理抛出的异常,或者已知的错误

    此文章是给多层开发的人使用的,小型代码,或者不理解多层开发的朋友,请绕道.

    多层开发已经很普遍,最少有2层.
    1:表现层(显示数据,图形处理,等等)
    2:处理层(逻辑处理,具体执行操作)

    或者可以分得更细,具体问题具体分析嘛.

    但是,在多层中,总是会有错误发生,大多数错误都是可以捕捉到的,或者是已经知道会发生的.
    那么,如果在某一层抛出异常,怎么办?难道像某些人说的一层一层向上递归,最后在显示层显示?
    这当然是不现实的!

    当然,代码包括2部分:1健壮的代码 2:怀疑的代码
    健壮的代码意思是:出错的几率很低,几乎不可能出错
    怀疑的代码意思是:可能会在某种情况下出错,比如数据库连接,谁知道什么时候数据库会出现问题呢.

    (1)我可以这么设计,一个模块,专门处理异常,或者一个类专门处理异常.
    那这个异常类本身如果出现问题,那只能忽略.
    如果异常类本身出现异常,如果不忽略,那就会调用自身,自身异常反复调用直到堆栈益出.
    所以:总结一点,错误处理类(模块)必须健壮,并且一但本身出错,忽略,不能再次调用本身的错误处理功能.

    (2)那么,这个处理类该怎么写呢?
    1:处理类 public class Exeception{} //专门用于处理错误
    2:错误消息 public class ExeceptionMessage{} //用于描述错误信息,和错误类型
    但这里有个问题,处理类太死板了.而且一般错误处理类是写在程序的最底层的.
    程序的层之间是单向的,不能出来依赖调用问题.(高层调用底层,底层不能调用高层)
    所以,按这个逻辑,这个错误处理类如果写在底层,如何让高层的显示层显示呢?
    那怎么办?事件委托就可以OK了.(具体事件可以在程序加载时由显示层注入)

    我大概说一下方案,具体实现要你们自己实施.(当然我写的比较粗糙)
    //错误消息
    public class ExeceptionMessage
    {
             public string Name;//错误名称
             public string Source;//错误来源
             public string Message;//错误具体的描述
             public int Leave;//错误等级,比如-1表示必须停止程序,0表示警告 1表示提示.
    }

    //-->在这里,先写事件,因为过后会要用到
    //错误参数,事件用到的函数参数
    public class ExeceptionEventArgs:EventArgs//必须从EventArgs继承.
    {
             public ExeceptionMessage ExeceptionMessage;

            public ExceptionEventArgs(){}//默认构造

            //构造并给一个值给成员 ExeceptionMessage 以便参数传递
            public ExeceptionEventArgs(ExeceptionMessage m)
            {
                 ExeceptionMessage=m;
            }
    }

    //定义错误委托声明(参数就是上面刚刚申明的)
    public delegate void ExeceptionEventHandle(ExeceptionEventArgs e);

    //主要的东西来了,这就是错误处理主程序
    //我写的比较简单,大家可以自由发挥
    public class Exeception
    {
           //委托事件实例,就是那个delegate建出来的,但实例时,必须用event
           //建了这个,就会出现类似OnClick+=那种闪电类型,嘿嘿
           public event ExeceptionEventHandle OnExeception;

           //处理主函数
           public void ThrowExeception(ExeceptionMessage m)
          {
                //这里省略,你可以写一些自己的基本代码
                //....比如你可以建一个错误列表等等,随你
                if(m!=null && OnExeception!=null)//检查错误消息是否为空&错误事件是否为空
                {
                      //调用刚才建立的委托实例.
                      OnExeception(new ExeceptionEventArgs(m));

                       //这里看等级,看看要不要终止程序
                      if(m.Leave==-1)
                       {
                          ........//程序停止代码
                       }

                }
                else{.......//如果传来的错误消息有问题,忽略(我在这故意这么写的)}
            }
    }

    这样一个简单的错误处理就出来了,当然,这个模型本身没有任何的处理事件

    事件要靠注入(我用了注入这个名字,因为我觉得更恰当些)

    如何使用呢?

    在整个程序初始化过后,或者某个自己认为恰当的地方,把某个函数注入进去

    //打比方在主函数注入.
    //注意:前提是错误处理类是一个静态函数.(当然我写的不是静态的,你可以改)
    //程序就一般只有一个错误处理模块,可以写成静态的.
    public static void Main()
    {
          //这里就可以注入一个与错误处理类无关的显示函数了.
          //这就实现了错误处理与表现无关的问题.
          //你可以在任何的层抛出异常,并由表现层来显示.
          Exeception.OnExeception+=new ExeceptionEventHandle(.....);
    }

    此文章只是一个简单的委托程序,起到抛砖引玉的作用,希望对有些人有些启发.

  • 相关阅读:
    使用tcmalloc编译启动时宕机
    使用tcmalloc编译出现undefined reference to `sem_init'
    使用AddressSanitizer做内存分析(一)——入门篇
    VIM-美化你的标签栏
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
    Entity Framework Code First (一)Conventions
  • 原文地址:https://www.cnblogs.com/yigedaizi/p/1454310.html
Copyright © 2011-2022 走看看