4

我正在尝试在 C# Windows 窗体应用程序中捕获所有未经处理的异常。我已将以下代码添加到Program.cs文件中,但未捕获异常,我得到异常,例如NullReferenceException. 我究竟做错了什么?

static void Main()
{ 
    System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(OnGuiUnhandedException);
    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
    var form = new MainForm();
    form.ShowDialog();
}

private static void HandleUnhandledException(Object o)
{
    // TODO: Log it!
    Exception e = o as Exception;
    if (e != null)
    {
    }
}

private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
{
    HandleUnhandledException(e.ExceptionObject);
}

private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    HandleUnhandledException(e.Exception);
}

编辑:当程序在 Visual Studio 外部运行时,我能够捕获异常,但是当从 Visual Studio 调试时,我无法捕获异常。我知道调试是为了消除错误。我应该在构建模式下运行程序以捕获异常吗?

4

3 回答 3

2

尝试在 VS 中禁用异常捕获,因为它似乎在异常到达您的处理程序之前捕获了它。

调试 > 异常... > 取消选中用户未处理的公共语言运行时异常。

于 2012-06-02T16:07:34.823 回答
0

如果您在 64 位 Windows 上,您可能需要检查 Debug->Exceptions 并检查是否引发了 CLR 异常。

C# 中的静默失败,看似未处理的异常,不会使程序崩溃

于 2012-06-02T14:57:07.357 回答
0

您订阅的事件仅提供检查异常的方法;它们并不意味着允许您抑制异常或从异常中恢复。

来自AppDomain.UnhandledException

此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。

如果您想在记录异常后从异常中恢复,则需要在代码周围使用 try-catch 块。

于 2012-06-02T14:57:18.233 回答