异常(Exception)问题的笔记

这几天又有了关于异常的几点积累,是从别人那学到的,即在这里以更好的掌握。
异常处理通常有两种观点:
1、 发生异常后还允许程序在另一处继续执行,而不致使整个程序中断。
2、 结构化异常:出错后即不可继续执行,即使程序中断。
C#中采用的是结构化异常,但也可以实现发生异常后继续执行的效果:用异常的嵌套,在嵌套的里面再准备一套在发生某种异常后执行的语句。
try
    {}
 catch
    {}
 ......
 catch
    {}
 final
    {}
1.当有多个catch语句时,特殊的异常先处理,写在前面,普通的异常写在后面,以保证特殊的异常被处理并提交,而不被普通异常屏蔽。
2、final 后面的语句是无论程序是否发生异常,catch是否捕捉,程序都要执行的语句,如一些资源的释放操作:IO操作,stream操作,数据库访问。
3.check 和 uncheck 是否检查计算溢出,.net中是默认检查的,在不希望检查时用 uncheck 语句
   还可以在c#编译器设置面板中的Checked选项(checked+)。
4.注意要保证 catch  final  语句中不会再抛出异常,否则相当麻烦。
5.(摘自 博客园 InterMa 的 Blog  他写得非常好,所以我就...... 呵呵) .net中工作线程中抛出未捕捉的异常会如何?猜想可能会是如下2种情况之一:
[1] 整个进程(程序)全死掉。
[2] 那个抛异常的线程无声无息的死掉,而不对其他线程造成影响。

正确的解答是:[2]

在Jason Clark的一篇介绍托管应用中的Exception文章中(MSDN开发精选2004年10月刊),概述了在应用程序中执行的未处理的异常处理程序的默认行为:
[1] 主线程上发生的未处理异常将导致该应用程序终止。
[2] 主线程以外的线程(包括手动线程,线程池线程和CLR的终结器线程)上发生的未处理异常将会被CLR处理。即发生异常时,你的应用程序没有任何表面迹象,仍会继续运行。

那么我们怎么来处理这种未捕捉线程呢?不管三七二十一用catch (Exception) {}把它们全catch了?这不是一个好的方法(会浪费资源)。这里引入一个最佳实践就是通过为以下事件注册处理函数,将这些未处理Exception的详细信息保存到日志中,以供了解这些未处理Exception的详细信息,为以后代码中catch这种特化的Exception提供了非常有用的参考信息。
这些事件是:
[1] Application.ThreadException(Windows窗体未处理异常)或Application_Error函数(ASP.Net页面未处理异常,Global.asax中)
[2] AppDomain.UnhandledException(CLR未处理异常)

转载于:https://www.cnblogs.com/lazhgg/archive/2006/01/02/309902.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值