如何确保在存在未处理的异常时记录异常

时间:2016-03-16 07:37:40

标签: c# win-universal-app

我想要一个崩溃报告,所以我在App.xaml.cs中注册UnhandledException事件,如下所示。但是有两个问题:

  1. 有时,没有异常的调用堆栈
  2. 有时,在进程终止之前,我没有足够的时间将日志写入文件。
  3. 有什么建议吗?

    this.UnhandledException += App_UnhandledException;
    
    private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        if (!hasHandledUnhandledException)
        {
            e.Handled = true;
            _logger.Error("Unhandle exception - message = {0}\n StackTrace = {1}", e.Exception.Message, e.Exception.StackTrace);
            await CrashHandler.ReportExceptionAsync(e.Exception.Message, e.Exception.StackTrace);
            hasHandledUnhandledException = true;
            throw e.Exception;
        }
    }
    

1 个答案:

答案 0 :(得分:1)

确保只访问e.Exception一次。在某些情况下,information about the stacktrace is lost the second time you access the property。将异常保存在变量中并直接使用该变量。另外,正如Panagiotis Kanavos在评论中所提到的,直接记录e.Exception.ToString()以确保不会遗漏任何信息。这将包括消息,callstack和所有内部异常(您没有在当前代码中登录)。

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    if (!hasHandledUnhandledException)
    {
        e.Handled = true;
        var exception = e.Exception;
        _logger.Error("Unhandled exception - {0}", exception);
        await CrashHandler.ReportExceptionAsync(exception.Message, exception.StackTrace);
        hasHandledUnhandledException = true;
        throw e.Exception;
    }
}

至于没有足够时间记录异常的问题,它由运行时控制,因此您无法对其进行任何操作。