gpt4 book ai didi

.net - 捕获任务中的异常

转载 作者:行者123 更新时间:2023-12-04 23:10:59 25 4
gpt4 key购买 nike

我几年前实现的基本 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 线程中,被 try/catch 捕获阻止在 Main()方法并在向用户显示友好消息并安全关闭应用程序之前记录。传递 stackTrace 以便日志包含调用者信息。

但是,我最近开始收到有关应用程序崩溃的报告,没有记录,也没有友好的消息,这个 Windows 对话框:

crash

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

关于.net - 捕获任务中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13012629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com