【发布时间】:2009-08-07 08:17:42
【问题描述】:
我在不同的类中有许多异步操作。
出错时会抛出继承自 System.Exception 的特殊异常。
以某种形式,我想通过 messageBox 捕捉它。
“Application.ThreadException”函数无法捕获它。
换句话说,当抛出一些异常时,我无法通过函数捕获所有异常
我该怎么办?
【问题讨论】:
标签: c# .net winforms exception
我在不同的类中有许多异步操作。
出错时会抛出继承自 System.Exception 的特殊异常。
以某种形式,我想通过 messageBox 捕捉它。
“Application.ThreadException”函数无法捕获它。
换句话说,当抛出一些异常时,我无法通过函数捕获所有异常
我该怎么办?
【问题讨论】:
标签: c# .net winforms exception
订阅 Application.UnhandledException,它会在任何未处理的异常上触发,并在 EventArgs 中公开带有详细信息的异常对象。
【讨论】:
基本上,您应该在每个线程的基础上处理异常,Application.ThreadException 作为最后的手段。
如何做到这一点取决于您使用的异步模式,但例如在使用 IAsyncResult 时,异常会为您“存储”并在您调用 EndIvoke(.., iar) 时抛出
【讨论】:
正如 Henk Holterman 已经建议您应该处理异常。只有那些未处理的讨厌的应该留给 Application.ThreadException。如果您当时不知道,虽然您可以在Application.ThreadException 事件处理程序方法中显示您的消息,但应用程序随后将终止。 Application.ThreadException 无法捕获某些异常,您必须处理 AppDomain.UnhandledException 事件。
AFAIK 最好不要在异步处理程序中抛出异常(大师,如果我错了,请纠正我)。处理它们的最佳方法是在用户调用 end invoke 或用户尝试检索响应对象时抛出异常。请注意,如果您 throw exc 来自一个线程的对象,它不会被其他线程捕获。因此,通知主线程的一种方法是引发一个事件(主线程已挂接到该事件),您将在其中传递响应对象。如果发生错误,则在响应对象的 getter 中引发异常,否则返回响应对象。另一种方法是只引发一个事件,该事件将告诉主线程有关异常的信息。
编辑: 刚看到你的评论:
我们可以捕获异常并重定向 页面到 asp.net 中的错误页面 在 web.config 中设置错误数据。 在winform中怎么做?
在 winforms 中没有直接的方法。我这样做的方式是每个线程有一个 HandleError 方法。此方法将接受异常对象作为参数并检查异常类型将显示一个消息框和/或记录它。
【讨论】:
异常在异步应用程序中很糟糕,因为一次只能在所有线程中处理一个异常(来自 MSDN)。目前您可以使用事件/委托来处理它。
VS2010 有一个新的异常处理器来处理多线程异常。
【讨论】: