Mik*_*scu 7 .net exception-handling thread-exceptions
这与之前的问题有关.
我现在想要了解的是如何防止UI线程异常终止应用程序,而非UI异常不能.
供参考,请参阅此示例.
最重要的是,在这种情况下我希望能够"静默地"终止进程 - 不显示Windows对话框,询问我是否要发送错误报告.
这是我的AppDomain UnhandledExceptionHandler:
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
// Maybe do some logging here if allowed
}
catch
{
}
// then just terminate the application
Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)
更新
根据本回答中的评论,我想澄清一点,最重要的是,我想了解更多关于使UI线程尽早通过该Application.ThreadException机制捕获未处理异常的机制.是否可以在非UI线程上实现此类行为.
在Google上进行了一些搜索之后,我发现了这个非常有趣的解释,这个解释是由Jeff Atwood在他的博客上描述的同样的问题.
大家好,很抱歉这个混乱.这种行为实际上就是设计,虽然设计有时会有点复杂.
首先要理解的是UnhandledException事件不是未处理的异常"处理程序".注册事件,与文档说的相反:-(,不会导致未处理的异常被处理.(从那以后它们不会被处理,但我将停止循环推理已经......)UnhandledException事件只是通知你异常未处理,如果你想在你的线程或应用程序死亡之前尝试保存状态.FWIW,我已经提交了一个错误来修复文档.
只是为了使事情复杂化,在v1.0和1.1中,未处理的异常并不总是意味着你的应用程序会死掉.如果未处理的异常发生在除主线程之外的任何其他线程或在非托管代码中开始生命的线程中,则CLR会使用异常并允许您的应用继续运行.这通常是邪恶的,因为经常发生的事情是,例如,ThreadPool线程会一个接一个地静静地消失,直到你的应用程序实际上没有做任何工作.弄清楚这种失败的原因几乎是不可能的.这可能就是Jeff之前认为它有效的原因......他总是在非主线程上看到崩溃.
在v2.0中,任何线程上的未处理异常都将取消应用程序.我们发现,调试崩溃比调试挂起或上面描述的静默停止工作问题要容易得多.
顺便说一句,在我的1.1机器上,来自MSDN的例子确实有预期的输出; 只是在你连接了一个调试器(或没有)之后,第二行才会显示出来.在v2中,我们已经翻转了一些东西,以便在调试器附加之前触发UnhandledException事件,这似乎是大多数人所期望的.
Jonathan Keljo CLR Exceptions PM Jonathan Keljo于2005年2月18日下午10:02
但是,我仍然对UI线程如何完成允许您为所有UI线程异常拥有一个catch-all处理程序的技巧感兴趣.
更重要的是,我对一种只为我的应用程序禁用.NET JIT调试对话框的方法非常感兴趣(没有为整个机器禁用它,如此处所示)
| 归档时间: |
|
| 查看次数: |
3863 次 |
| 最近记录: |