C# 捕获所有崩溃的通用函数

C# 捕获所有崩溃的通用函数,c#,wpf,exception-handling,C#,Wpf,Exception Handling,我有一个WPF应用程序 我希望应用程序具有一个通用函数,用于捕获不在try-catch块中的所有崩溃。应用程序不应该崩溃并停止工作。相反,它应该重新启动自身,以尝试再次运行。如果应用程序真的一团糟,它不应该进入无休止的重启循环 我尝试使用AppDomain.UnhandledExceptionHandler,它确实满足了抛出的异常,但在执行该方法后,程序仍然崩溃 有办法做到这一点吗?试试: Application.ThreadException += new ThreadExceptio

我有一个WPF应用程序

我希望应用程序具有一个通用函数,用于捕获不在try-catch块中的所有崩溃。应用程序不应该崩溃并停止工作。相反,它应该重新启动自身,以尝试再次运行。如果应用程序真的一团糟,它不应该进入无休止的重启循环


我尝试使用AppDomain.UnhandledExceptionHandler,它确实满足了抛出的异常,但在执行该方法后,程序仍然崩溃

有办法做到这一点吗?

试试:

    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?
    }

这对我来说非常有效:

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

  void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
  {
        string message = e.Exception.Message;
        ...
要重新启动WPF应用程序,我使用
Windows.Forms
libraries:

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

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

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


一旦
异常
到达该处理程序,就太晚了,无法避免关闭,但是如果您记录到达该点的
异常
s,然后,您可以查看发生了哪些问题,并添加进一步的异常处理来解决这些问题。

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


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

例如:

// 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   
}

如果使用此技术,请不要忘记,这样重新启动过程不会被弹出的对话框中断

为什么不阻止异常发生,而不是让它发生并尝试重新启动它?诚然,有些例外是无法避免的,但只有少数例外。在这些地方你会添加异常处理。我相信没有人会如此聪明地编写100%容易出错的代码,所以以用户友好的方式处理一小部分未处理的异常是很好的。AppDomain.UnhandledExceptionHandler让你有机会在退出程序之前记录未处理的异常进行调试,不是为了避免撞车。@chris,我理解。这就是我在问题中实际解释的。“在那一点之后无目的地继续”虽然是一条很好的一般规则,但OP并不是说让应用程序继续,而是让它自己重新启动有限次。这是一个合法的用例——想想Windows服务中的“恢复”选项卡