Windows窗体中未处理的非ui线程异常

时间:2008-12-30 18:18:20

标签: c# .net winforms multithreading

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

Thread.GetDomain().UnhandledException非常适合捕捉错误,但是到那时为止它已经太晚了(除了记录它)。控制权从您的UnhandledException处理程序传出后,应用程序将终止。你可以期待的最好的是一个通用的Windows错误,它看起来像这样:

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

我的所有研究都表明你必须在工作线程方法中插入一个try / catch块,但我想把它放在那里以防万一有人采取不同的措施。

感谢。

4 个答案:

答案 0 :(得分:2)

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

你至少应该在这里处理像FileNotFoundException这样的异常,你可以在那里做一些聪明的事情。如果所有其他方法都失败了,你可以使用UnhandledException来干净地处理你没想到的任何东西(希望这些东西都没有)。

答案 1 :(得分:1)

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

辅助线程中未处理的异常将终止该线程。请参阅SafeThread了解替代方案

警告:我是SafeThread文章的作者

答案 2 :(得分:0)

听起来你误解了......你没有将代码“放入”一个帖子中。您在线程上“运行”代码。

无论你把try catch块放在哪里,它都可以在任何线程上执行...如果你想让catch中的代码做某事(操作)一个UI元素,你只需要“运行”那个代码在UI元素创建的任何线程上(如果需要)。

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

答案 3 :(得分: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
}