【问题标题】:Return an object in catch block within Task body在任务主体内的 catch 块中返回一个对象
【发布时间】: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 永远不会看到它们。结论:请将您的问题更改为实际发生的问题,并提供您所看到的工作示例。
  • 感谢西蒙的留言。我会检查我很久没有检查的旧问题,如果我找到我可以接受的答案,我会标记它们。
  • 你是对的丹尼尔。我简化了问题,希望能快速找到解决方案。无论如何,我最终确实找到了它,我的错误在下面的答案中进行了解释。谢谢。

标签: c# exception task


【解决方案1】:

您的问题可以更好地解释,但据我了解,这正是您想要做的并且应该工作的事情。

//(Task body)
{
    A result = null;
    try
    {
        //something that might throwing exception but could also new the result
    }
    catch(Exception)
    {
        result = new A() { success = "yes" }
    }

    return result;
}

在任务中捕获的异常不应传播到 AggregateException。如果这种情况仍然发生,那么您在代码的其他地方做错了。

【讨论】:

  • 你说得对,我做错了什么。为此,你得到了复选标记。说明如下。谢谢
【解决方案2】:

情绪控制了我。

与往常一样,问题是我以前看不到的。

我试图简化我的问题以找到问题的根源,这就是上面的代码如此基本的原因。事实证明,Task 异常处理非常复杂,尤其是当我们处理内部 Task 和 Wait 调用时。

我正在调用 innerTask.Wait() 方法,而该方法正在抛出 Aggregate 异常。

http://msdn.microsoft.com/en-us/library/dd235635.aspx

尽管 innerTask 执行正在运行,并且它正在返回对象,但外部任务在此之前正在处理异常。

一旦我意识到这一点,修复就非常简单易行了。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 2011-02-11
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多