我试图在遗留 winforms 应用程序中捕获异常,但不知何故,该异常总是由全局异常处理捕获。
在 Program.cs 中,我有以下代码:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
//throw new NotImplementedException();
MessageBox.Show(e.Exception.Message);
}
在表单中我有以下代码:
private void gttBindingSourceLosplaatsen_PositionChanged(object sender, EventArgs e)
{
try
{
bool enabled = ((DataTable)gttBindingSourceLosplaatsen.DataSource).Rows.Count > 0;
buttonEditLosplaats.Enabled = enabled;
buttonDeleteLosplaats.Enabled = enabled;
}
catch
{
MessageBox.Show("what is this ?");
}
}
现在当行“buttonDeleteLosplaats.Enable = enabled;”时执行时出现异常。现在我希望落入捕获 block 并显示消息“这是什么?”但这并没有发生,我总是陷入全局异常处理程序。
这可能是什么原因造成的?此应用程序中还有许多其他 try..catch 结构可以按我的预期工作并落入 catch block ,但不是这个。 有人知道为什么我不进入本地 try...catch block 而是进入全局异常处理程序吗?
最佳答案
您找到抛出此异常的代码的几率为零,Enabled 属性不能抛出“Index -1 没有值”异常。
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
那才是你真正的问题。为 Application.ThreadException 编写事件处理程序很好,但只有在不需要调试程序时才有效。激活 UnhandledExceptionMode.CatchException 后,当程序抛出时您会变得非常盲目。调试器无法再停止并向您显示问题,现在是您的 ThreadException 事件处理程序吞下了它。从技术上讲,您仍然可以让它停止,您需要使用 Debug + Exceptions,勾选 CLR 异常的 Thrown 复选框。
但是要以正确的方式解决这个问题,在调试时不要启用这个事件处理程序。修复:
if (!System.Diagnostics.Debugger.IsAttached) {
Application.ThreadException += Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
}
关于c# - try catch 在 WinForms 应用程序中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654058/