尝试在WinForms应用程序中捕获不正常

Gui*_*doG 1 c# exception-handling winforms

我试图在遗留的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);
}
Run Code Online (Sandbox Code Playgroud)

在表格中我有以下代码:

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 ?");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在当行"buttonDeleteLosplaats.Enable = enabled;"时 执行异常发生.现在我希望陷入阻塞区并显示消息"这是什么?" 但这不会发生,我总是落入全局异常处理程序.

什么可能导致这个?在这个应用程序中有很多其他的try..catch构造,它们按照我的预期工作,并且确实属于catch块,但不是这个.有没有人知道我为什么不进入本地try ... catch块而是进入全局异常处理程序?

Han*_*ant 6

您发现抛出此异常的代码的几率为零,Enabled属性不能抛出"索引-1没有值"异常.

 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Run Code Online (Sandbox Code Playgroud)

那是你真正的问题.为Application.ThreadException编写事件处理程序很好,但只有在不需要调试程序时才能正常工作.激活UnhandledExceptionMode.CatchException后,程序抛出时会非常盲目.调试器不能再停止并向您显示问题,它现在是吞下它的ThreadException事件处理程序.从技术上讲,你仍然可以让它停止,你需要使用Debug + Exceptions,勾选CLR异常的Thrown复选框.

但是以正确的方式解决这个问题,请不要在调试时启用此事件处理程序.固定:

    if (!System.Diagnostics.Debugger.IsAttached) {
        Application.ThreadException += Application_ThreadException;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    }
Run Code Online (Sandbox Code Playgroud)