.net – 捕获任务中的异常

几年前实现的我的基本ViewModel为运行任务提供了这种扩展方法,同时保持UI响应*:

protected void Work(Action job)
{
    IsBusy = true;
    var stackTrace = new StackTrace();
    var task = Task.Factory.StartNew(job)
        .ContinueWith(failedTask => HandleException(failedTask, stackTrace), 
                      TaskContinuationOptions.OnlyOnFaulted)
        .ContinueWith(_ => { IsBusy = false; });
}

void HandleException(Task task, StackTrace stackTrace)
{
    Dispatcher.BeginInvoke(
        () => { throw new Exception(task.Exception.InnerException.ToString() + 
                                    stackTrace); });
}

IsBusy是从UI观察到的属性,用于显示进度条.

HandleExceptions背后的想法是,它们被观察然后抛入UI线程,由Main()方法中的try / catch块捕获并在向用户显示友好消息并安全关闭应用程序之前记录.传递stackTrace,因此日志包含调用者信息.

但是,我最近开始使用此Windows对话框获取有关应用程序崩溃的报告,而无需记录,也没有友好消息:

查看Windows事件日志,我们得到了这个EventData:

Application: xxxxApplication.Loader.exe

Framework Version: v4.0.30319

Description: The process was terminated due to an unhandled exception.

Exception Info: System.AggregateException

Stack: at System.Threading.Tasks.TaskExceptionHolder.Finalize()

我是否在使用ContinueWith()做错了什么?

任务异常是否可能以某种方式保持不被观察?

*:我了解BackgroundWorker.这可能在当时看起来更好,或者有其他好处.

最佳答案 我建议你处理
AppDomain.CurrentDomain.UnhandledException

要么显示您的“友好消息”或(如果这不是您的解决方案)您至少可以在此事件中记录错误,然后查看堆栈跟踪是什么来确定此“未处理”任务异常发生的位置.

点赞