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块而是进入全局异常处理程序?
您发现抛出此异常的代码的几率为零,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)
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |