如果没有在每个工作线程方法中插入try / catch块,是否有办法处理Windows窗体中未处理的非ui线程异常?
Thread.GetDomain().UnhandledException
非常适合捕捉错误,但是到那时为止它已经太晚了(除了记录它)。控制权从您的UnhandledException
处理程序传出后,应用程序将终止。你可以期待的最好的是一个通用的Windows错误,它看起来像这样:
我的所有研究都表明你必须在工作线程方法中插入一个try / catch块,但我想把它放在那里以防万一有人采取不同的措施。
感谢。
答案 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
}