是否有一种简单的方法可以捕获所有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回调)?
答案 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)并防止弹出微软错误对话框。