C# 尝试捕获在WinForms应用程序中无法正常工作

C# 尝试捕获在WinForms应用程序中无法正常工作,c#,winforms,exception-handling,C#,Winforms,Exception Handling,我试图捕获遗留winforms应用程序中的异常,但无论如何,该异常总是由全局异常处理捕获 在Program.cs中,我有以下代码: Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMo

我试图捕获遗留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;”时,会发生异常。现在我希望进入catch块并显示消息“这是什么?”但这并没有发生,我总是进入全局异常处理程序

这是什么原因造成的?在这个应用程序中还有很多其他的try..catch结构,它们按照我的预期工作,并且属于catch块,但不是这个。
有人知道为什么我不属于本地try…catch块,而是属于全局异常处理程序吗?

发现引发此异常的代码的几率为零,Enabled属性无法引发“Index-1没有值”异常

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

但请用正确的方法解决此问题,在调试时不要启用此事件处理程序。修正:

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

找到引发此异常的代码的几率为零,则Enabled属性无法引发“Index-1没有值”异常

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

但请用正确的方法解决此问题,在调试时不要启用此事件处理程序。修正:

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

如果要捕获所有未处理的异常,请尝试指定异常类型(或泛型)。如果catch无法处理指定的异常类型,则会发生抛出

try
{
    bool enabled = ((DataTable)gttBindingSourceLosplaatsen.DataSource).Rows.Count > 0;
    buttonEditLosplaats.Enabled = enabled;
    buttonDeleteLosplaats.Enabled = enabled;
}
catch (Exception ex)
{
    MessageBox.Show("what is this ?");
}

如果要捕获所有未处理的异常,请尝试指定异常类型(或泛型)。如果catch无法处理指定的异常类型,则会发生抛出

try
{
    bool enabled = ((DataTable)gttBindingSourceLosplaatsen.DataSource).Rows.Count > 0;
    buttonEditLosplaats.Enabled = enabled;
    buttonDeleteLosplaats.Enabled = enabled;
}
catch (Exception ex)
{
    MessageBox.Show("what is this ?");
}

我通过将代码更改为以下内容解决了问题:

gttTextBoxLotnr.Focus();
this.ActiveControl = gttTextBoxLotnr;

bool enabled = ((DataTable)gttBindingSourceLosplaatsen.DataSource).Rows.Count > 0;
buttonEditLosplaats.Enabled = enabled;
buttonDeleteLosplaats.Enabled = enabled;
现在,异常“Index-1没有值”不再出现,我也不再需要try-catch了。 buttonDeleteLosplaats的焦点属性为true,这在将enabled属性设置为false时以某种方式导致异常

这仍然给我留下了两个可能永远无法回答的问题:

  • 我仍然不知道为什么我的条款没有达成
  • 将焦点控件的enabled属性设置为false会引发异常,为什么需要这样做?我想不出有哪种情况会严重到引发异常,表单应该没有主动控制,就是这样,没有伤害,任何宇宙中的任何地方都没有问题,那么为什么要引发异常呢

  • 我通过将代码更改为以下内容解决了问题:

    gttTextBoxLotnr.Focus();
    this.ActiveControl = gttTextBoxLotnr;
    
    bool enabled = ((DataTable)gttBindingSourceLosplaatsen.DataSource).Rows.Count > 0;
    buttonEditLosplaats.Enabled = enabled;
    buttonDeleteLosplaats.Enabled = enabled;
    
    现在,异常“Index-1没有值”不再出现,我也不再需要try-catch了。 buttonDeleteLosplaats的焦点属性为true,这在将enabled属性设置为false时以某种方式导致异常

    这仍然给我留下了两个可能永远无法回答的问题:

  • 我仍然不知道为什么我的条款没有达成
  • 将焦点控件的enabled属性设置为false会引发异常,为什么需要这样做?我想不出有哪种情况会严重到引发异常,表单应该没有主动控制,就是这样,没有伤害,任何宇宙中的任何地方都没有问题,那么为什么要引发异常呢

  • 哪一个例外?发布完整的异常。将您的
    Show
    更改为
    MessageBox.Show(e.ToString())
    然后发布结果。您是否尝试使用
    catch(例外e)
    ?您忘记了另外两个:
    AppDomain.CurrentDomain.UnhandledException
    main
    本身(其代码也应位于
    try/catch
    中)。异常为“索引-1没有值”但这无关紧要,问题是为什么我不属于catch块但是仍然不能很好地工作异常确实很重要,因为
    索引-1没有值
    告诉我们在您将按钮设置为启用后,异常发生在其他地方,并且其他地方很可能没有捕获到异常。哪个异常?发布完整的异常。将
    显示
    更改为
    消息Box.Show(e.ToString())
    然后发布结果。您是否尝试过使用
    catch(exception e)
    ?您还忘记了另外两个:
    AppDomain.CurrentDomain.UnhandledException
    main
    本身(其代码也应该位于
    try/catch
    内部)。异常是“Index-1没有值”“但这并不重要,问题是我为什么不落入陷阱。我也尝试过使用catch(异常e),但仍然无法正常工作异常确实很重要,因为
    索引-1没有值
    告诉我们在您将按钮设置为启用后,异常发生在其他地方,我实现了你的代码,现在我确实把它变成了