gpt4 book ai didi

c# - try catch 在 WinForms 应用程序中无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:57 25 4
gpt4 key购买 nike

我试图在遗留 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com