C# 尝试捕获在WinForms应用程序中无法正常工作
我试图捕获遗留winforms应用程序中的异常,但无论如何,该异常总是由全局异常处理捕获 在Program.cs中,我有以下代码:C# 尝试捕获在WinForms应用程序中无法正常工作,c#,winforms,exception-handling,C#,Winforms,Exception Handling,我试图捕获遗留winforms应用程序中的异常,但无论如何,该异常总是由全局异常处理捕获 在Program.cs中,我有以下代码: Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMo
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时以某种方式导致异常
这仍然给我留下了两个可能永远无法回答的问题:
我通过将代码更改为以下内容解决了问题:
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时以某种方式导致异常
这仍然给我留下了两个可能永远无法回答的问题:
哪一个例外?发布完整的异常。将您的
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没有值
告诉我们在您将按钮设置为启用后,异常发生在其他地方,我实现了你的代码,现在我确实把它变成了