分享

C#异常处理初探

 小茂。 2012-02-16

try catch finally简单的三个关键字,其处理流程却较为复杂,下面先分各种情况讨论,最后得出结论,并提出使用建议。

1 没有发生异常的情况

  1. class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             try  
  6.             {  
  7.                 //throw new Exception("my exception");   
  8.                 Console.WriteLine("in try");  
  9.             }  
  10.             catch (Exception ex)  
  11.             {  
  12.                 Console.WriteLine("in catch: " + ex.Message);  
  13.             }  
  14.             finally  
  15.             {  
  16.                 Console.WriteLine("in finally");  
  17.             }  
  18.             Console.WriteLine("after finally");  
  19.         }  

输出为:

in try
in finally
after finally

 

分析:

由于没有发生异常,catch也就捕获不到,所以不执行catch里的代码,执行finally的代码,然后执行后续代码。

 

2.发生异常,并且被本级catch捕获

  1. class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.             try  
  6.             {  
  7.                 throw new Exception("my exception");  
  8.                 Console.WriteLine("in try");  
  9.             }  
  10.             catch (Exception ex)  
  11.             {  
  12.                 Console.WriteLine("in catch: " + ex.Message);  
  13.             }  
  14.             finally  
  15.             {  
  16.                 Console.WriteLine("in finally");  
  17.             }  
  18.             Console.WriteLine("after finally");  
  19.         }  
  20.   
  21.     }  


 

执行结果:

in catch: my exception
in finally
after finally

分析:

try块发生异常的语句以后的代码不再执行,而是马上被catch捕获,并执行catch块里的代码,然后执行finally块的代码,然后执行后续代码。

3 发生异常,被上级catch捕获

代码:

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         try  
  6.         {  
  7.             test();  
  8.             Console.WriteLine("in 上一级try");  
  9.         }  
  10.         catch (Exception ex)  
  11.         {  
  12.             Console.WriteLine("in 上一级catch: " + ex.Message);  
  13.         }  
  14.         finally  
  15.         {  
  16.             Console.WriteLine("in 上一级finally");  
  17.         }  
  18.         Console.WriteLine("after 上一级的finally");  
  19.     }  
  20.   
  21.     static void test()  
  22.     {  
  23.         try  
  24.         {  
  25.             throw new Exception("my exception");  
  26.             Console.WriteLine("in try");  
  27.         }  
  28.         catch (IOException ex)  
  29.         {  
  30.             Console.WriteLine("in catch: " + ex.Message);  
  31.         }  
  32.         finally  
  33.         {  
  34.             Console.WriteLine("in finally");  
  35.         }  
  36.         Console.WriteLine("after finally");  
  37.     }  
  38. }  


 

执行结果:

in finally
in 上一级catch: my exception
in 上一级finally

after 上一级的finally

分析:

发生异常后,本级catch没有捕获到,异常继续向上流转,被上一级catch捕获到后,执行本级的finally,然后执行上一级的catch,然后执行上一级的finally.

本级的finally后面的代码不会执行。

4.发生异常,没有被本级catch捕获,也没有被上级任何catch捕获

代码:

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         try  
  6.         {  
  7.             test();  
  8.             Console.WriteLine("in 上一级try");  
  9.         }  
  10.         catch (IOException ex)  
  11.         {  
  12.             Console.WriteLine("in 上一级catch: " + ex.Message);  
  13.         }  
  14.         finally  
  15.         {  
  16.             Console.WriteLine("in 上一级finally");  
  17.         }  
  18.         Console.WriteLine("after 上一级的finally");  
  19.     }  
  20.   
  21.     static void test()  
  22.     {  
  23.         try  
  24.         {  
  25.             throw new Exception("my exception");  
  26.             Console.WriteLine("in try");  
  27.         }  
  28.         catch (IOException ex)  
  29.         {  
  30.             Console.WriteLine("in catch: " + ex.Message);  
  31.         }  
  32.         finally  
  33.         {  
  34.             Console.WriteLine("in finally");  
  35.         }  
  36.         Console.WriteLine("after finally");  
  37.     }  
  38. }  


执行结果:

未经处理的异常:  System.Exception: my exception
   在 ConsoleApplication4.Program.test() 位置 D:\MyProjects\VS2010 Projects\Cons
oleApplication4\ConsoleApplication4\Program.cs:行号 33
   在 ConsoleApplication4.Program.Main(String[] args) 位置 D:\MyProjects\VS2010
Projects\ConsoleApplication4\ConsoleApplication4\Program.cs:行号 15
in finally
in 上一级finally

分析:

异常发生后,本级catch没有捕获到,流转到上一级catch,上一级catch也没有捕获到,继续流转直到CLR,CLR会打印“未处理...",并在用户按下取消按钮后,执行本级的finally块,然后执行上一级的finally块,最后强制终止程序。

finally块后面得内容均不能执行。

 

5.结论

(1)try块中,没有发生异常,try->finally->后续代码;

(2)try块中,发生异常语句后面的代码不会执行;

(3)try块中,发生异常,如果被本级catch捕获,那么 本级catch块-->本级finally块-->后续代码;

(4)try块中,发生异常,如果被上级catch捕获,那么 本级finally块-->上级catch块-->上级finally块-->上级后续代码;

(5)try块中,发生异常,如果没有被任何级别catch捕获,那么 本级finally块-->上级finally块--->程序终止。

6 异常使用建议(仅供参考)

 (1)发布的程序应该尽量避免因为没有catch到异常而被迫关闭,从而让用户觉得你的程序不健壮,所以至少要在最上级catch中捕获所有异常;

 (2)需要清理资源的部分,尽量放入finally块,因为无论如何finally块总会被执行。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多