2008-12-30 832 views
1

在每个工作线程方法中插入try/catch块的方法是否有处理Windows窗体中未处理的非UI线程异常的方法?在Windows窗体中未处理的非UI线程异常

Thread.GetDomain().UnhandledException非常适合捕捉错误,但到那时对它做任何事情都太迟了(除了记录它)。控制通过UnhandledException处理程序后,应用程序将终止。你可以期望的最好的是一个通用的Windows错误,看起来这样的:

http://i40.tinypic.com/2be98i.jpg

我所有的研究表明,你必须插入辅助线程方法的try/catch块,但我希望把如果有人有不同的需要,那么这里。

谢谢。

回答

2

如果您想在遇到UnhandledException之前对错误做些什么,那么您需要在线程方法中使用try/catch。

你至少应该在这里处理像FileNotFoundException这样的异常,在这里你可以做一些聪明的事情。如果一切都失败了,你可以使用UnhandledException彻底处理任何你没有想到的事情(希望这是没有的)。

0

这听起来像你误解......你不把代码“放入”一个线程。你在一个线程上运行代码。

无论你放置try catch块,它最终都可以在任何线程上执行......如果你想让catch中的代码做一些操作UI元素,你只需要“运行”代码创建UI元素的任何线程(如有必要)。

每个WinForms UI元素都有两个成员可以帮助您解决这个问题InvokeRequired(),如果它在任何线程上执行,则返回一个布尔值,而不是创建元素的线程(在这种情况下,您必须切换线程)和BeginInvoke()会自动切换到正确的线程。

+0

权。我应该更清楚了。当我写'工作线程方法'时,我正在谈论线程启动时将执行的代码。它不是'UI线程'到'工作线程'*切换*问题,因为它是一个错误处理问题。谢谢。 – 2008-12-30 18:42:08

1

Thread.GetDomain()。UnhandledException解散为AppDomain.UnhandledException,通常对于应用程序中的所有线程都是相同的域 - 换句话说,您只需挂钩一次该事件,而不是每个线程一次。

辅助线程中未处理的异常将终止该线程。看到SafeThread一种替代

警告:我是SafeThread文章

0

处理异常的作者,您必须插入的线程中执行的代码内try/catch块。

如果你仔细想一想,UnhandledException实际上是有名的。这个例外是'未处理',因此你无法做任何事情。太晚了!

真的,除了线程的上下文之外,没有太多可以做到“保存”它不会崩溃,因为没有上下文需要纠正。因此,UnhandledException对于日志记录和尝试确定为什么在崩溃后崩溃有用。

如果你想想如何try/catch语句的工作原理:

try 
{ 
    // run this code 

} 
catch (Exception ex) 
{ 
    // an exception happened in the above try statement inside MY thread 
}