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

时间:2015-04-15 15:14:32

标签: c# winforms exception-handling

我试图在遗留的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;”时执行异常发生。现在我希望陷入阻塞区并显示消息“这是什么?”但这不会发生,我总是落入全局异常处理程序。

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

3 个答案:

答案 0 :(得分:6)

您发现抛出此异常的代码的几率为零,Enabled属性不能抛出"索引-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);
    }

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我通过将代码更改为此来解决了我的问题:

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

bool enabled = ((DataTable)gttBindingSourceLosplaatsen.DataSource).Rows.Count > 0;
buttonEditLosplaats.Enabled = enabled;
buttonDeleteLosplaats.Enabled = enabled;

现在异常"索引-1没有值"不再发生,我不再需要尝试捕获。 buttonDeleteLosplaats具有Focused属性= true,并且在将enabled属性设置为false时以某种方式导致异常。

这仍然让我有两个问题可能永远无法回答:

  1. 我仍然不知道为什么没有达到我的捕获条款
  2. 将聚焦控件的enabled属性设置为false会引发异常,为什么需要这样做?我不能想到任何条件,这是严重到足以引发异常,表格应该只是没有主动控制,它是没有伤害,任何宇宙中的任何地方都没有问题,所以为什么抛出一个例外?