2009-08-07 47 views
0

我在不同的类中有很多异步操作。如何在有很多异步操作的操作时捕获WinForms中的异常

当出错时,它会抛出从System.Exception继承的特殊异常。
在某些形式中,我想通过messageBox来捕捉它。

函数“Application.ThreadException”无法捕捉它。

换句话说,当抛出一些异常时,我无法捕捉到函数的所有异常。 我该怎么办?

回答

4

订阅应用.UnhandledException它触发任何未处理的异常,并在EventArgs中公开带有详细信息的异常对象。

2

基本上你应该在每个线程的基础上处理异常,并以Application.ThreadException作为最后的手段。

如何做到这一点取决于你使用的异步模式,但使用例如当IAsyncResult的例外是“储存”你和抛出,当你调用EndIvoke(..,IAR)

+0

例如,我们可以通过在web.config中设置错误数据来捕获异常并将页面重定向到asp.net中的错误页面。 winform怎么做? – 2009-08-07 16:03:38

0

正如亨克霍尔特曼已经建议你应该处理异常。只有那些未处理的讨厌应该留给Application.ThreadException。如果您不知道,那么虽然您可以在Application.ThreadException事件处理程序方法中显示您的消息,但应用程序将随后终止。某些例外情况未被Application.ThreadException捕获,您将必须处理AppDomain.UnhandledException事件。 AFAIK最好不要在异步处理程序中抛出异常(大师们,如果我错了,请纠正我)。处理它们的最好方法是在用户调用结束调用或用户尝试检索响应对象时引发异常。请注意,如果您从一个线程中获取对象throw exc它不会被其他线程捕获。所以,通知主线程的一种方法是引发一个你传递响应对象的事件(主线程已经挂钩了)。如果发生错误,则在响应对象的getter中引发异常,否则返回响应对象。另一种方法是提出一个事件,告诉主线程异常。

编辑: 刚才看到您的评论:

我们可以捕获异常,并通过 重定向 页面,在asp.net中的errorPage web.config中设置错误的数据。 winform怎么做?

在winforms中没有直接的方法。我这样做的方法是每个线程都有一个HandleError方法。此方法将接受异常对象作为参数,并检查异常的类型将显示消息框和/或记录它。

0

在异步应用程序中异常是不正常的,因为异常只能在所有线程(来自MSDN)上一次处理一次。目前,您可以使用事件/代表处理它。

VS2010有一个新的异常处理程序用于处理多线程异常。