【问题标题】:Unhandled Exception in Winforms ApplicationWinforms 应用程序中未处理的异常
【发布时间】:2011-02-19 05:23:54
【问题描述】:

我有一个简单的 WinForms 应用程序,用于输入测试用例。自从我将此应用程序升级到 .NET 4.0 并在选项卡页控件中添加了一个新选项卡页以针对 XSD 架构验证 XML 以来,应用程序一直在随机崩溃。我一直无法重现异常。

我的 QA 人员收到的错误是通用 Windows 消息:

TestCaseViewer 遇到问题需要关闭。给您带来的不便,我们深表歉意。

为了解决真正的错误,我在程序的 Main 方法的开头添加了以下代码:

        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += Application_ThreadException;

事件处理程序如下所示:

    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        try
        {
            MessageBox.Show(e.Exception.ToString(), @"Thread Exception", 
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        finally 
        {
            Application.Exit();    
        }
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        try
        {
            var ex = (Exception)e.ExceptionObject;
            MessageBox.Show(ex.ToString(), @"Unhandled Exception",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        finally 
        {
            Application.Exit();    
        }
    }

不幸的是,这并没有帮助,无论是什么错误都会继续这样做,从而产生未处理的错误,并冒泡到操作系统。

谁能给我关于捕获此异常的任何其他想法?

【问题讨论】:

  • 堆栈跟踪? MessageBox.Show(e.Stacktrace);
  • 只要堆栈跟踪不为空,就会在异常调用 ToString() 时返回。

标签: winforms exception unhandled


【解决方案1】:

尝试将以下内容添加到您的 app.config 中

<runtime>
   <!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
   <legacyUnhandledExceptionPolicy enabled="1" />
</runtime>

【讨论】:

  • 我真的不知道这是做什么的,但它看起来非常可疑。你需要解决这个该死的问题,而不是因为强迫你的程序在未知状态下盲目地坚持下去而拍自己的背。
【解决方案2】:

如果您使用的是 Visual Studio,则可以将其设置为在所有未处理的异常,甚至在任何时候抛出异常时中断,无论是否它由您的代码处理。

为此,请从“调试”菜单中选择“异常”。你会得到一个如下所示的对话框:

  

如果您真的想认真一点,请尝试勾选所有选项。然后,从您的 QA 人员那里找出触发异常的具体操作,并在开发环境中的调试器下运行时准确地重现这些操作。每当抛出异常时,Visual Studio 都会中断,您会看到有问题的代码行以及完整的堆栈跟踪。

【讨论】:

  • 我确实在我的 IDE 中检查了该设置。问题是我无法按照与他只是在数据网格中单击相同的步骤重现错误。该错误不会连续两次以相同的方式表现出来。我有一种感觉,数据绑定接线或网格中的代码处理位置发生了变化。
  • @Loathian:这个测试员在你们公司吗?把他带到你的电脑前,让他重现这个错误。我不确定你在这里寻找什么其他类型的答案。修复无法重现的错误几乎是不可能的。出于这个原因,每个错误数据库都可以选择将错误关闭为“无重现”。如果这是一位在偏远地区有特殊需求的客户,情况可能会有所不同,但如果您无法在自己的 QA 部门的帮助下重现它,我怀疑这里的任何人都可以帮助您。
  • 它是我自己公司的测试员,实际上就坐在我对面。如果他可以再次创建错误,我将让他使用一些调试工具来捕获它,看看我们是否可以通过这种方式获取堆栈跟踪。我真的只是在找人来检查我的异常处理代码,看看我是否犯了任何错误。
  • @Loathian:啊,我明白了。好吧,我相信某些类型的异常即使是UnhandledException 事件处理程序中编写得最完美的异常处理代码也无法捕获。将 Visual Studio 设置为在引发任何异常时中断是我所知道的最简单的解决方法。您说您的代码没有帮助,并暗示错误继续在堆栈中冒泡。我认为这意味着它是可重现的,但是当它发生时您无法中断以获取堆栈跟踪。假设您可以实现它,我演示的方法将适用于此。
  • 我们今天找到了它……这个错误是从我们用来以“漂亮”格式呈现 XML 的 winforms 控件中抛出的。看起来在控件上调用 dispose 时正在引发错误。控件是:System.Windows.Forms.WebBrowser ...这里是错误信息:System.Windows.Forms.UnsafeNativeMethods+IOleObject.SetClientSite(IOleClientSite) at System.Windows.Forms.WebBrowserBase.TransitionFromRunningToLoaded() at System.Windows .Forms.WebBrowserBase.TransitionDownTo(AXState) 在 System.Windows.Forms.WebBrowser.Dispose(Boolean)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
相关资源
最近更新 更多