C#异常处理初探

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

1 没有发生异常的情况

class Program { static void Main(string[] args) { try { //throw new Exception("my exception"); Console.WriteLine("in try"); } catch (Exception ex) { Console.WriteLine("in catch: " + ex.Message); } finally { Console.WriteLine("in finally"); } Console.WriteLine("after finally"); }

输出为:

in try
in finally
after finally

分析:

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

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

class Program { static void Main(string[] args) { try { throw new Exception("my exception"); Console.WriteLine("in try"); } catch (Exception ex) { Console.WriteLine("in catch: " + ex.Message); } finally { Console.WriteLine("in finally"); } Console.WriteLine("after finally"); } }


执行结果:

in catch: my exception
in finally
after finally

分析:

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

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

代码:

class Program { static void Main(string[] args) { try { test(); Console.WriteLine("in 上一级try"); } catch (Exception ex) { Console.WriteLine("in 上一级catch: " + ex.Message); } finally { Console.WriteLine("in 上一级finally"); } Console.WriteLine("after 上一级的finally"); } static void test() { try { throw new Exception("my exception"); Console.WriteLine("in try"); } catch (IOException ex) { Console.WriteLine("in catch: " + ex.Message); } finally { Console.WriteLine("in finally"); } Console.WriteLine("after finally"); } }


执行结果:

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

after 上一级的finally

分析:

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

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

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

代码:

class Program { static void Main(string[] args) { try { test(); Console.WriteLine("in 上一级try"); } catch (IOException ex) { Console.WriteLine("in 上一级catch: " + ex.Message); } finally { Console.WriteLine("in 上一级finally"); } Console.WriteLine("after 上一级的finally"); } static void test() { try { throw new Exception("my exception"); Console.WriteLine("in try"); } catch (IOException ex) { Console.WriteLine("in catch: " + ex.Message); } finally { Console.WriteLine("in finally"); } Console.WriteLine("after finally"); } }


执行结果:

未经处理的异常: 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值