生命如此短暂,掌握技艺却要如此长久

风流不在谈锋胜, 袖手无言味最长。**_** 莫言大道人难得,自是功夫不到头。

导航

异常(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未处理异常)

posted on 2006-01-02 20:01  拼命郎  阅读(324)  评论(0编辑  收藏  举报