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

时间:2017-07-20 12:25:50

标签: c# wpf crash-reports hockeyapp

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

我正在与HockeyApp支持人员讨论此事,但我想知道是否有其他人遇到过这个问题。我应该取出退出(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 个答案:

答案 0 :(得分:1)

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

  

退出会立即终止应用程序,即使其他线程是   运行。如果在应用程序条目中调用return语句   点,它导致应用程序仅在所有前景后终止   线程已经终止。

     

如果从try或catch块调用Exit,则最后的代码   块不执行。如果使用return语句,则代码在   finally块确实执行。

最佳做法往往是基于意见和情境依赖。例如,我们在未处理的异常上记录堆栈跟踪,然后在我们的UWP应用程序中调用Environement.FailFast(我们不使用Hockey应用程序)。我们的逻辑很简单 - 我们的记录器工具可能还活着但我们对应用程序的其余部分不太确定。如果连记录器设备都不起作用,我们无论如何也无法做任何事情。 Imho ExitFailFast是最后一步,只有在您无法恢复某些有效状态时才能使用。