当前位置:   article > 正文

C#中关于try-catch的异常捕获问题_c #try catch 捕获异常行为什么会返回是0

c #try catch 捕获异常行为什么会返回是0
        在平日工作里,我们的有时候需要对代码进行异常捕获,那么我们就需要了解到try-catch语句。
        首先,我们通过如下面代码可以知道throw是将该异常抛出,即Test()中存在异常,由Test()捕获并抛出,并在Main中接收到并处理。在Test()中的throw下方的Console.WriteLine并未执行。那么我们可以得出如下结论:
结论1: throw中的异常被抛出后,该异常被外层调用处接收。 且t hrow 下方代码不被 执行
示例一
 
        其次,我们将示例一中的第31行进行修改,那么得出如下结果,Main的catch没有执行,原因是因为异常被Test中的catch捕获,并处理了,由于自行处理了,且并未将该异常往外抛,则出现Main中无任何异常捕获。
结论2:catch捕获后,若自行处理,则不会对外由任何影响;若通过throw往外抛,则会由外层再次捕获到。
 
示例二
        
        接着,我们在示例二再做修改,如下图所示,Test()捕获异常后,先自行处理,再通过throw直接抛出,我们会发现真正错误的第26行的堆栈信息被丢失了。而外层Main中只报了第32行处有错,并未直接指出错误的本身是第26行导致的。
结论3:当一个异常由throw直接被抛出,那么再次接收到的异常会存在堆栈信息的缺失。
示例三:
 
        最后,我们将示例三中的代码进行修改,如下图所示,我们在Test()中的catch中捕获到异常后,在throw抛出时,我们创建了新的自定义异常new Exception("错误的堆栈信息:",e),并将原始的异常作为innerException,所以异常信息中包含了多个层次的异常信息。
结论:当异常信息通过throw抛出后,我们应该采用 new Exception(string message, Exception innerException)方式抛出,这样保证堆栈信息的完整,能快速定位出异常的具体位置。
 
  1. using System;
  2. namespace ExceptionDemo
  3. {
  4.     class Program
  5.     {
  6.         static void Main(string[] args)
  7.         {
  8.             try
  9.             {
  10.                 Test();
  11.             }
  12.             catch (Exception e)
  13.             {
  14.                 Console.WriteLine("1=====================");
  15.                 Console.WriteLine(e);
  16.                 Console.WriteLine("1=====================");
  17.             }
  18.             Console.ReadKey();
  19.         }
  20.         public static void Test()
  21.         {
  22.             try
  23.             {
  24.                 int i = 0;
  25.                 i = 10 / i;
  26.             }
  27.             catch (Exception e)
  28.             {
  29.                 Console.WriteLine("2=====================");
  30.                 Console.WriteLine(e);
  31.                 throw new Exception("错误的堆栈信息:",e);
  32.                 Console.WriteLine("2=====================");
  33.             }
  34.         }
  35.     }
  36. }

对技术感兴趣的小伙伴,可以给我留言或私聊我,我们可以互相讨论学习。

欢迎关注我个人的公众号

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/252891
推荐阅读
  

闽ICP备14008679号