首页 文章

System.Environment.Exit(0)阻止hockeyapp注册崩溃

提问于
浏览
2

我启动了一个空白的WPF应用程序(如下所示)来实现HockeyApp崩溃报告 . 程序启动时,会弹出一个窗口,其中只有一个按钮供用户按下 . 当用户单击它时,处理程序会尝试除以零并使应用程序崩溃 . 我收到了崩溃报告,一切都运行顺利直到我模仿我们更大的系统的错误捕获方法,即使用DispatcherUnhandledException事件处理程序来捕获"uncaught"异常,然后调用System.Environment.Exit(0)以优雅地结束后台的任何内容 . 现在HockeyApp api不知道如果在更高级别捕获异常使得HockeyApp认为"Oh, they got things under control"并且不会注册"crash."

我正在与HockeyApp支持人员谈论此事,但我想知道是否有其他人遇到过这个问题 . 我应该取出Exit(0)行,还是在我们有未被捕获的例外时退出应用程序有更好的做法?我已经尝试将错误代码从0更改为574(ERROR_UNHANDLED_EXCEPTION)而没有结果 . 我不相信我们需要保存任何数据,除了HockeyApp api已有的数据 .

App类:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        RegisterHockeyAppCrashReporting();

        Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
    }

    private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        System.Environment.Exit(0);
    }

    private async void RegisterHockeyAppCrashReporting()
    {
        HockeyClient.Current.Configure(AppConstants.APP_ID)
            .SetContactInfo(AppConstants.USER_NAME, AppConstants.USER_EMAIL);
        await HockeyClient.Current.SendCrashesAsync(true);
    }
}

MainWindow类:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var zero = 0;
        var number = 1;
        var crash = number / zero;
    }
}

1 回答

  • 1

    Environement.Exit立即终止您的申请 . 所以,我想,曲棍球没有做任何事情并没有什么奇怪的 .

    即使其他线程正在运行,Exit也会立即终止应用程序 . 如果在应用程序入口点调用return语句,则会导致应用程序仅在所有前台线程终止后终止 . 如果从try或catch块调用Exit,则任何finally块中的代码都不会执行 . 如果使用return语句,则finally块中的代码将执行 .

    最佳实践往往是基于意见和情境依赖 . 例如,我们在未处理的异常上记录堆栈跟踪,然后在我们的UWP应用程序中调用 Environement.FailFast (尽管我们不使用Hockey应用程序) . 我们的逻辑很简单 - 我们的 Logger 工具可能还活着但我们无论如何都无法做任何事情 . Imho ExitFailFast 是仅在您无法恢复某些有效状态时才应使用的最后步骤 .

相关问题