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

标签 c# winforms exception

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

相关文章:

c# - 如何在.net core 2.2 的启动文件中注册polly?

c# - MouseLeave 未触发 C# WinForms

c# - Windows 窗体 PictureBox - 如何在窗体的特定区域显示图像

c++ - 使用 Define 抛出异常

unit-testing - 异常的 Racket 测试

java.text.ParseException : Unparseable date "yyyy-MM-dd' T'HH:mm:ss. SSSZ"- SimpleDateFormat

c# - 我可以使用 Node.js 调用 C# 方法吗?

c# - 无法在 Visual Studio 2013 上找到 Visual Studio 安装程序项目

c# - 运行时类型转换

c# - 为什么 Concurrent Whatever.Count 会截取快照