【发布时间】:2012-11-29 11:24:00
【问题描述】:
请考虑以下情况。
我有一个任务,它返回一个对象,假设它的类型:
class A
{
string success;
}
现在任务的主体是例如:
{
return new A() { success = "yes" }
}
此任务的外部无关紧要,如果它是连续任务或其他任何东西。重要的是,在从该任务返回时,我可以通过 task.Result.status 读取这个返回的对象。
我遇到的问题是,如果我想在 try/catch 块中返回该类型的对象,task.Result.status 为 null,并且 task.Result 属于 AggregatedException 类型。比如:
//(Task body)
{
{
try
{
//something throwing exception
}
catch(Exception exc)
{
return new A() { success = "yes" }
}
}
当执行从该任务返回时,我正在寻找一种方法来获取在 catch 块中返回的对象,而不是我现在收到的 AggregatedException。
请克制自己不要使用通常的论坛“答案”,例如“你为什么想要它”、“它有什么意义”等。我对这样的答案不感兴趣。
如果它不能完成并且你知道这是一个事实(也许抛出异常时的任务总是返回 AggregatedException 无论如何),那么请直截了当地告诉我。另一方面,如果可以的话,我会了解如何实现这一目标。
卢卡斯
【问题讨论】:
-
您所描述的没有发生。在
ContinueWith中传入的任务有一个与前一个任务的返回值类型相同的Result。所以在你的情况下应该是A。它永远不可能是异常,除非前一个任务实际上返回了异常(返回,而不是抛出!)。此外,在任务主体中捕获的异常永远不会导致 AggregateException,因为 TPL 永远不会看到它们。结论:请将您的问题更改为实际发生的问题,并提供您所看到的工作示例。 -
感谢西蒙的留言。我会检查我很久没有检查的旧问题,如果我找到我可以接受的答案,我会标记它们。
-
你是对的丹尼尔。我简化了问题,希望能快速找到解决方案。无论如何,我最终确实找到了它,我的错误在下面的答案中进行了解释。谢谢。