我试图在遗留的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块而是进入全局异常处理程序?
答案 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时以某种方式导致异常。
这仍然让我有两个问题可能永远无法回答: