在UI事件回调中尝试/捕获块

时间:2010-02-10 20:38:21

标签: c# exception-handling

是否有一种简单的方法可以捕获所有UI事件回调中的所有异常,而不是在每次回调中调用try / catch?

这是我到目前为止所尝试的内容:

UI回调:


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

切入点:


public static void Main(string[] args)
{
  try
  {
    Application.Run(new MyForm());
  }
  catch (Exception e)
  {
    Debug.Print(e.Message);
  }
}

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

3 个答案:

答案 0 :(得分:3)

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

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

如果您无法正常处理异常,那么您应该允许异常传播,并拆除您的应用程序。否则,你已经把自己置于一个潜在的糟糕状态,你会产生比你解决的问题更多的问题。

放入“全局”异常处理程序很有帮助 - 但更多的是用于记录以查看错误并更正错误。它们不应该被用作“全部捕获”以保持应用程序运行。

答案 1 :(得分:0)

可以使用Postsharp。

话虽如此,抓住所有异常并继续下去是一个坏主意。通过这样做,你可以让你的应用程序处于一个非常糟糕,不可预测的状态。

答案 2 :(得分:0)

是的,有。

来自MSDN:

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

你应该使用本地的try / catch块(并且大量使用try / finally,特别是如果你实现了全局捕获),用于你知道会发生的任何异常。

例如,在本地块中,您应该始终放置:

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

全局catchall实际上应该只用于实现自定义错误对话框和优雅清理(因此自由使用try / finally)并防止弹出微软错误对话框。