解析C#中断言与异常的应用方式及异常处理的流程控制

2019-12-26 16:59:43王冬梅
易采站长站为您分析C#中断言与异常的应用方式及异常处理的流程控制,一般来说断言用于修正程序员自己的错误而异常用于应对程序运行过程中可能出现的错误,需要的朋友可以参考下  

断言与异常(Assertion Vs Exception)
在日常编程实践中,断言与异常的界限不是很明显,这也使得它们常常没有被正确的使用。我也在不断的与这个模糊的怪兽搏斗,仅写此文和大家分享一下我的个人看法。我想我们还可以从很多角度来区别断言和异常的使用场景,欢迎大家的意见和建议。

异常的使用场景:用于捕获外部的可能错误

断言的使用场景:用于捕获内部的不可能错误

我们可以先仔细分析一下我们在.net中已经存在的异常。

  • System.IO.FileLoadException
  • SqlException
  • IOException
  • ServerException

    首先,我们先不将它们看成异常,因为我们现在还没有在异常和断言之间划清界限,我们先将它们看成错误。

    当我们在编码的第一现场考虑到可能会出现文件加载的错误或者服务器错误后,我们的第一直觉是这不是我们代码的问题,这是我们代码之外的问题。

    例如下面这段代码

    
    public void WriteSnapShot(string fileName, IEnumerable<DbItem> items)
        {
          string format = "{0}t{1}t{2}t{3}t{4}t{5}";
          using (FileStream fs = new FileStream(fileName, FileMode.Create))
          {
            using (StreamWriter sw = new StreamWriter(fs, Encoding.Unicode))
            {
               ...
              foreach (var item in items)
              {
                sw.WriteLine(string.Format(format, new object[]{
                  item.dealMan,
                  item.version,
                  item.priority,
                  item.bugStatus,
                  item.bugNum,
                  item.description}));
              }
              sw.Flush();
            }
          }
        }
    

    上面的代码在写入文件,很显然会导致IOException。稍微有经验的程序员都会考虑到IO上可能出问题,那我们应该如何处理这个问题呢?在这个上下文中,我们别无它法,只能让这个错误继续往上抛,通知上面一层的调用者,有一个错误发生了,至于上一层调用者会如何处理,不是这个函数要考虑的问题。但在这个函数中,要记得一点,将当前函数中所占用的资源释放了。因此,当我们不能控制的外部错误出现时,我们可以将其作为异常往上抛,这时,我们该使用异常。