【问题标题】:Global exception catch works only while debugging the WinForms application全局异常捕获仅在调试 WinForms 应用程序时起作用
【发布时间】:2013-10-29 08:52:35
【问题描述】:

我在我的 WinForms 应用程序中实现了以下全局异常 catch

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyMainForm());
        }
        catch (Exception ex)
        {
            MessageBox.Show("UNHANDLED EXCEPTION: The program will be terminated. Details follow:\n\n" +
                getExceptionInfoWithDebuggerOutput(ex),
                "Global Exception",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
        }
    }
}

然后在代码中,引发了一个异常(就像这个 - 完全是由于我的健忘):

public partial class MyPage : UserControl
{

    void func1()
    {
        SqlConnectionStringBuilder conStr = null;

        //... later
        conStr.DataSource = strServer;  //<<--- Where exception is raised
    }
}

现在,如果我正在调试我的项目,我会看到来自全局异常处理程序的 Global Exception 消息框。

但是,如果我没有调试我的项目并将其作为 Ctrl+F5 运行,或者如果我构建了一个发布项目,我会得到以下窗口,而不是我上面编写的那个:

知道如何让我的全局异常处理程序代替处理吗?

【问题讨论】:

  • 您拥有的不是全局异常处理程序。新表单在单独的线程上运行,并且您在该线程中没有异常处理。

标签: c# .net winforms exception exception-handling


【解决方案1】:

你应该挂钩一个事件,例如AppDomain.UnhandledException

这些事件在您在发布模式下看到的全局错误处理程序之前引发。这使您可以在退出之前记录错误……以更好的方式。

还引发了其他事件。例如,Application.ThreadException。阅读文档将使您更好地了解您的特定需求。

我必须注意,您看到的错误是 NullReferenceException.. 理想情况下,它会在您的代码中得到很好的处理。不过,挂钩这些事件并记录异常是个好主意。

【讨论】:

  • 谢谢。是的,我知道在实际功能中捕获它是合适的。我在这里谈论的是全局日志记录功能(可以说是最后的选择。)所以这里没有万能的解决方案,对吧?
  • 我提供了文档的链接。读一读。我为您提供的事件是针对应用程序特定部分的“包罗万象”的解决方案。还有一个 AppDomain.FirstChanceException 事件会为每个异常触发。但您无法处理这些异常,它们只是通知。
  • 好的,我想我想说的是,是否有一个我需要挂钩的“什么”列表,以便能够在此应用程序中捕获所有可能的全局范围未捕获异常?
  • AppDomain.UnhandledExceptionApplication.ThreadException 是最大的两个。如果您想记录每个异常,即使是由代码处理的异常,请使用AppDomain.FirstChanceException。据我所知,这就是“清单”。
  • 感谢您的帮助。这个页面的底部有一个很好的例子来说明如何做到这一点:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2012-02-03
  • 2019-06-13
  • 2013-10-25
  • 1970-01-01
  • 2013-10-10
  • 2016-04-10
相关资源
最近更新 更多