【问题标题】:Handling global exceptions without killing the app?在不杀死应用程序的情况下处理全局异常?
【发布时间】:2012-02-19 15:32:16
【问题描述】:

我在代码中抛出了各种自定义异常。

其中一些是可以恢复的,所以我想要一个全局处理程序来捕获它们,显示警告,然后继续。

我发现AppDomain.UnhandledException 事件有一个IsTerminating 参数,但这是只读的。

是否有某种事件或其他方式来全局捕获异常,仍然可以让您处理它们并继续?

(这是在表单中,但我也会对 WPF 解决方案感兴趣)

【问题讨论】:

  • 可能重复:link

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


【解决方案1】:

你可以使用 global.asax 和

void Application_Error(object sender, EventArgs e)
{
}

捕获页面上未捕获的错误的事件。

在此范围内,您可以使用多种方法,但其中一种方法是这样的:

void Application_Error(object sender, EventArgs e)
{
    Exception opException = Server.GetLastError();

    switch (opException.GetBaseException().GetType().Name)
    {
        case "OptimisticConcurrencyException":
                        //display a friendly message
                    break;
    }


    Server.ClearError();

}

或类似的东西

【讨论】:

  • 正如我所说,这是 Forms,而不是 ASP。
  • 啊抱歉,我的错误,我听到了“表单”,只是假设为“WebForms”! 掌心
【解决方案2】:

尝试类似:

AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;

public static void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // You might have to try changing this to your custom exception type and then have overloads or pass it as an object and cast it in the HandleException method
    HandleException(e.ExceptionObject as Exception);
}

private static void HandleException(Exception exception)
{
    if (exception == null) return;

    // Do a check in here against the exceptions that you want to handle or don't want to handle and either display a message, log, quit, etc
}

没有注意到winforms,我很久没做forms了,所以这是WPF,可能有效或可能需要调整。

【讨论】:

  • 这正是我已经在做的事情。到事件触发时,运行时已经决定终止应用程序。我所能做的就是显示一条消息。
  • @GazTheDestroyer 如果您使用 try / catch 包装您的主应用程序运行命令并将其传递给 HandleException 您应该能够自己调用关闭/退出
  • 如果我包装 Application.Run 那么它会在抛出异常时退出。我不想退出应用程序。
  • @GazTheDestroyer 如果你给它一个明确的 Environment.Exit() 或 Application.Current.Shutdown() 命令,它只会退出,因为你正在捕捉错误,你可以根据需要处理它。老实说,如果您遇到未处理的错误,您应该退出应用程序,因为您可能会弹出错误数据或奇怪的错误。您应该只捕获所有错误,以便找出在哪里提供正确的错误处理代码。
  • 如果我将 Application.Run() 包装在 try catch 中,则 catch 位于 Run() 函数之外,即我的应用程序在 catch 时不再运行,因此很遗憾不可行。非常感谢您的帮助,但我想我现在已经解决了。
【解决方案3】:

找到了解决办法。使用Application.ThreadException 而不是AppDomain.UnhandledException。但你也必须告诉它在 UI 线程上也给出异常:

public static void SetupGlobalExceptionHandler()
{
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    Application.ThreadException += OnException;
}

static void OnException(object sender, ThreadExceptionEventArgs args)
{
    MessageBox.Show("There was a problem. Error is:\n\n" + args.Exception.Message);
}

【讨论】:

    【解决方案4】:

    这是一个旧线程,但 Dispatcher.UnhandledException 事件的事件参数上有一个 Handled 参数,您可以使用它来阻止应用程序关闭。

    protected override void OnStartup(StartupEventArgs e)
    {
        Dispatcher.UnhandledException += Dispatcher_UnhandledException;
    }
    private void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        HandleException(e.Exception);//your handler
        e.Handled = true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-20
      • 2013-08-05
      • 1970-01-01
      • 2015-06-06
      • 2012-06-05
      • 2016-03-30
      • 2014-07-30
      • 2019-07-26
      相关资源
      最近更新 更多