导航

线程中抛出未捕捉的异常会如何? [修正版]

Posted on 2006-01-01 11:22  InterMa  阅读(6145)  评论(2编辑  收藏  举报
以前写过一篇关于这个主题的文章( http://interma.cnblogs.com/archive/2005/10/20/258781.html ),今天回过头去看看,发现写错了。ft死了,赶紧作此修正版,新年新气象嘛。

工作线程中抛出未捕捉的异常会如何?猜想可能会是如下2种情况之一:
[1] 整个进程(程序)全死掉。
[2] 那个抛异常的线程无声无息的死掉,而不对其他线程造成影响。

正确的解答是:[2]

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

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

最后祝大家2006新年快乐,心想事成,