捕获所有崩溃的通用函数

时间:2014-08-21 08:16:53

标签: c# wpf exception-handling

我有一个WPF应用程序。

我希望应用程序有一个通用函数来捕获try-catch块中没有的所有崩溃。应用程序不应该崩溃并停止工作。相反,它应该重新启动自己再次尝试进行操作。如果事实证明应用程序真的搞砸了它就不应该进入无限循环的重启。

我尝试使用AppDomain.UnhandledExceptionHandler,它确实会引发抛出的异常,但在执行该方法后 - 程序仍然崩溃。

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:1)

这对我很有用:

  Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(AppDispatcherUnhandledException);

  void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
  {
        string message = e.Exception.Message;
        ...

要重新启动WPF应用,请使用Windows.Forms个库:

System.Windows.Forms.Application.Restart();
Application.Current.Shutdown();

答案 1 :(得分:0)

尝试:

    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_UnhandledException);


    // Catch-all exception handler
    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        if (e.Exception != null)
        {
           //do somethine
        }
        if (e.Exception.InnerException != null)
        {
            //do logging?
        }
        //do logging?
    }

    // Catch-all exception handler
    private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        if (e.ExceptionObject != null)
        {
            if (e.ExceptionObject is Exception)
            {
                //do logging?
            }
        }

        //do logging?
    }

答案 2 :(得分:0)

没有办法做到这一点,而且,尝试这样做是不明智的。如果发生了未处理的Exception,您不知道发生了什么或为什么......在这一点之后漫无目的地继续这不是一个好主意,因为您的应用可能没有互联网或数据库连接,或任何其他问题会使应用程序无法使用。

更好的解决方案是处理您认为Exception最有可能发生的所有情况,然后只是记录(或存储在数据库中)任何Exception发生并被AppDomain.UnhandledException处理程序捕获。

一旦Exception进入该处理程序之后,为避免关闭而为时已晚,但如果您记录到达该点的Exception,那么您可以看到有哪些问题已经发生并进一步增加Exception处理以解决这些问题。

答案 3 :(得分:0)

如果您希望在未处理的崩溃后重新启动应用程序,例如,如果它在Kiosk或类似的东西上运行,您可能希望将其包装在一个简单的shell中。

这个shell可以启动你的应用程序,在应用程序结束时检查returnvalue,并在它看起来崩溃时重新启动它。您可以计算崩溃的数量,并在多次后停止重新启动应用程序。当然,使用AppDomain.UnhandledExceptionHandler创建未处理错误的日志,以便您修复这些错误并将代码包装在try .. catch中。

例如:

// Start the application and wait for it to exit.
var process = Process.Start(applicationPath, commandLineArguments);

process.WaitForExit();

// If the exit code is not 0, the application closed abnormally.
if (process.ExitCode != 0)
{
     // restart process   
}

如果您使用此技术而不是忘记disable error reporting,那么重启过程不会被弹出对话框中断