• 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(.....);
    }

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

  • 相关阅读:
    当物联网遇上云原生:K8s向边缘计算渗透中
    NLP预训练发展小结一(Bert之前)
    netty系列之:搭建HTTP上传文件服务器
    netty系列之:搭建自己的下载文件服务器
    HTTP系列之:HTTP中的cookies
    HTTP系列之:HTTP缓存
    netty系列之:自建客户端和HTTP服务器交互
    [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型
    [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区
    [源码解析] 深度学习流水线并行之PipeDream(1)--- Profile阶段
  • 原文地址:https://www.cnblogs.com/yigedaizi/p/1454310.html
Copyright © 2020-2023  润新知