2010-02-10 45 views
1

是否有一种简单的方法来捕获所有UI事件回调中的所有异常,而不是在每个回调中调用try/catch?在UI事件回调中尝试/捕获块

这里是我试过到目前为止:

UI回调:


private void btnOk_Click(object sender, EventArgs e) 
{ 
    int x=0; 
    int i=1/x;//Exception happens here. 
} 

切入点:

​​

在DebugView中,我可以看到DivideByZero例外。但是,MyForm已关闭且无法操作。我希望能报告例外并继续运作。是否有一种简单的方法可以让MyForm将异常发送到Debug.Print(),而无需直接将try/catch添加到btnOk_Click(以及所有其他UI回调)?

回答

3

不,没有 - 这不是一个好主意尝试。

你真的应该只在异常发生后才能继续正常处理异常。在这种情况下,事件处理程序知道它在做什么,(可能)可以处理异常,提供有意义的反馈,保持合理的状态并允许程序继续。在表单之外,这是不可能的。

如果你不能正常处理异常,那么你应该允许异常传播,并拆除你的应用程序。否则,你已经将自己置于一种潜在的不良状态,并且你会创造出比解决问题更多的问题。

加入“全局”异常处理程序是有帮助的 - 但更多的是为了查看错误并进行更正。不应该将它们用作“全部捕获”来保持应用程序的运行。

0

可能使用此项后发生的问题。

这就是说,捕获所有异常并继续是一个糟糕的主意。通过这样做,你可以让你的应用程序变得非常糟糕,不可预知。

0

是的,有。

从MSDN:

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

您应该使用本地try/catch块(并自由使用try /终于,尤其是当你实现一个全球包罗万象)对,你知道会发生的任何异常。

例如,在一个局部块,你应该始终把:

try { 
... 
catch(TypeOfKnownCommonException ex) { 
... 
} 

全球包罗万象真的应该仅用于实现自定义错误对话框和清理优雅(试的,因此宽松的用途/最终)并防止弹出微软错误对话框。

+0

SetUnhandledExceptionMode不允许发生这种情况。它改变了未处理异常的行为,但不允许程序继续执行。 (它只是改变线程例外策略)。 –

+0

哦,你说得对。我打算参考: Application.ThreadException 在那里捕获的任何东西都将允许程序继续执行。我会更新我的链接。 – Bob

+0

它不会继续往前走 - 它只是让特定的线程从拆除应用程序。如果这是你的UI线程,但是,你仍然会关闭。 –