gpt4 book ai didi

c# - 任务并行库异常处理

转载 作者:太空狗 更新时间:2023-10-29 23:33:05 24 4
gpt4 key购买 nike

在处理 TPL 任务中的异常时,我遇到了两种处理异常的方法。第一个捕获任务中的异常并在结果中返回它,如下所示:

var task = Task<Exception>.Factory.StartNew(
() =>
{
try
{
// Do Something

return null;
}
catch (System.Exception e)
{
return e;
}
});

task.ContinueWith(
r =>
{
if (r.Result != null)
{
// Handle Exception
}
});

第二个是文档中显示的那个,我想正确的做法是:

var task = Task.Factory.StartNew(
() =>
{
// Do Something
});
task.ContinueWith(
r =>
{
if (r.Exception != null)
{
// Handle Aggregate Exception
r.Exception.Handle(y => true);
}
});

我想知道第一种方法有什么问题吗? 我使用这种技术时不时地收到“未处理的聚合异常”异常,我想知道这是怎么发生的?

澄清一下,我认为第二种模式更好,但我有一大块代码使用了第一种模式,我正试图找出它是否需要重构,即如果事实证明不是全部异常将被捕获。

最佳答案

第一种方法假定每次调用都会引发异常。虽然这可能是真的,但这些异常(exception)似乎并不“异常(exception)”,而且有设计问题的味道。如果异常不是异常,那么结果就没有多大意义。另一个问题是,如果你确实想要一个“结果”(即 Exception 以外的东西)你不能,因为唯一的 Result 插槽用于 异常。另一个问题是您不会在主线程上重新抛出异常(您可以手动执行此操作),因此您不会获得 catch 语义(即您正在使用 Handle 方法)。

第二种方法会被更多人更好地理解。

关于c# - 任务并行库异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12484219/

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