System.Environment.Exit(0)阻止hockeyapp注册崩溃
我开始了一个空白的WPF应用程序(如下所示)来实现HockeyApp崩溃报告。 当程序启动时,一个窗口弹出一个按钮供用户按下。 当用户点击它时,处理程序尝试除以零并使应用程序崩溃。 我收到崩溃报告,并且一切都运行顺利直到我模仿了我们的大系统的错误捕获方法,即使用DispatcherUnhandledException事件处理程序捕获“未捕获”异常,然后调用System.Environment.Exit(0)以正常方式结束任何内容的背景。 现在HockeyApp api不会发送崩溃报告。 我想知道如果在更高层次上捕捉例外情况会让HockeyApp认为“哦,他们控制了事情”,并且不会发生“崩溃”。
我现在正在与HockeyApp支持人员讨论这个问题,但我想知道是否有其他人有这个问题。 我是否应该取出Exit(0)行,或者当我们有未捕获的异常时退出应用程序是否有更好的做法? 我试图将错误代码从0更改为574(ERROR_UNHANDLED_EXCEPTION),但没有结果。 我不相信有任何我们需要保存的数据,除了HockeyApp API已经有的数据。
应用程序类:
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;
}
}
Environement.Exit
立即终止您的应用程序。 所以,我想,曲棍球什么都不做也没什么奇怪的。
即使其他线程正在运行,Exit也会立即终止应用程序。 如果在应用程序入口点中调用return语句,它将导致应用程序仅在所有前台线程终止后终止。
如果从try或catch块调用Exit,则任何finally块中的代码都不会执行。 如果使用return语句,finally块中的代码会执行。
最佳做法倾向于基于观点和情况。 例如,我们在未处理的异常上记录堆栈跟踪,然后在我们的UWP应用程序中调用Environement.FailFast
(尽管我们不使用曲棍球应用程序)。 我们的逻辑很简单 - 我们的记录器设施可能还活着,但我们对应用程序的其他部分不太确定。 如果即使记录器设备不起作用,我们也无法做任何事情。 Imho Exit
和FailFast
是最后一个步骤,只有在您无法恢复某个有效状态时才会使用。
上一篇: System.Environment.Exit(0) preventing hockeyapp from registering a crash
下一篇: Mutex lock in C++ destructor causes exception when exit() called in Python