在Task实体中的catch块中返回一个对象

时间:2012-11-29 11:24:00

标签: c# exception task

请考虑以下情况。

我有一个Task,它返回一个对象,让我们说它是类型:

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,无论如何),那么请告诉我这么简单。另一方面,如果可以的话,我会嘲笑如何实现这一目标。

卢卡斯

2 个答案:

答案 0 :(得分: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;
}

在Task中捕获的异常不应传播到AggregateException。如果仍然发生这种情况,那么代码中的其他地方就会出错。

答案 1 :(得分:0)

我的情绪最好。

一如既往,问题是我以前无法看到的。

我试图简化我的问题以找到问题的根源,这就是为什么代码在上面是如此基本。事实证明,Task异常处理非常复杂,特别是当我们处理内部任务和Wait调用时。

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

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

即使innerTask执行正在运行,并且它正在撤回对象,外部任务也在处理异常之前。

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