如何正确崩溃应用程序

本文关键字:应用程序 崩溃 何正确 | 更新日期: 2023-09-27 18:35:06

我在项目的 App 类中有一个处理未经处理的异常的处理程序。它用于设置"发送反馈"按钮。

应用xaml.cs

private void Application_DispatcherUnhandledException(
    object sender, DispatcherUnhandledExceptionEventArgs e)
{
    try
    {
        // Try to collect feedback with dialog.
        new ApplicationExceptionDialog(e).ShowDialog();
    }
    catch
    {
        MessageBox.Show(
            "A problem has occurred with the program:'r'n'r'n" +
            e.Exception.Message + "'r'n'r'n" +
            "The application will now exit.",
            "Application Error",
            MessageBoxButton.OK,
            MessageBoxImage.Error);
    }
    finally
    {
        Application.Current.Shutdown(1); // ← Is this okay?
    }
}

问题

除了处理各种异常之外,当所有其他异常都失败时,在未处理的异常后退出应用程序的正确方法是什么?

编辑

此问题特定于 WPF 应用程序。我在应用程序中也有非托管代码,以使登录更安全。我没有遇到任何问题,但我需要确保如果出现问题,使用的退出流程是最佳选择。

如何正确崩溃应用程序

关闭 WPF 应用的正确方法是使用 Application.Shutdown 。这将指示所有消息泵停止,并允许执行清理代码(如关闭事件)。它还使所有非后台线程保持运行。在您的情况下,这可能不是您想要的

由于您有一个未处理的异常,您的系统处于未知状态 - 您无法假设关闭事件将正常运行,并且任何正在运行的线程都将正常终止。因此,我建议使用 Environment.Exit ,这将关闭进程,并且所有线程都在运行。但它将运行您的finally块和类终结器,这些块和类终结器通常用于释放获取的资源。

如果您认为在当前状态下运行终结器可能会导致现有数据/资源损坏,或对系统造成任何其他类型的损坏,则应改用 Environment.FailFast。这将指示操作系统立即终止您的进程,而不运行任何终结器。您可能希望使用它超过Environment.Exit,具体取决于应用程序的目的。

要退出控制台应用程序,请尝试

Environment.Exit(0);

对于 Windows 应用程序,请尝试:

Application.Exit(0);