处理全局异常而不杀死应用程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理全局异常而不杀死应用程序?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

你可以使用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();

}

或类似的东西

另一答案

尝试类似的东西:

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,我没有在很长一段时间内完成表格,所以这是WPF,可能有用或者可能需要调整。

另一答案

找到了解决方案。使用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:

" + args.Exception.Message);
}
另一答案

这是一个旧线程,但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;
}

以上是关于处理全局异常而不杀死应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程

如何在活动的 onSaveInstanceState() 之后杀死所有打开的片段

Spring批处理ItemWriter异常正在杀死工作

SpringBoot(十九)@ControllerAdvice+@ExceptionHandler全局捕获Controller异常

异常和TCP通讯

python中的异常处理:厌而不舍