2012-11-29 13 views
-2

请考虑以下情形。返回任务主体内catch块中的对象

我有一个任务,它返回一个对象,可以说这是类型:

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无论如何),那么请告诉我这么简单。如果可以,另一方面,我会appriciate我如何能够实现这一点。

卢卡斯

+0

你描述的没有发生。在'ContinueWith'中,传入的任务具有与前一个任务的返回值类型相同的Result。所以它应该是'A'在你的情况下。它永远不会是一个异常,除非上一个任务实际返回异常(返回,而不是抛出!)。此外,在任务正文内部捕获的异常不会导致AggregateException,因为TPL永远不会看到它们。结论:请将您的问题改为实际发生的事情,并提供您所看到的实例。 –

+1

谢谢你的注意西蒙。我会仔细查看一下我很久没有检查的旧问题,如果我找到可以接受的答案,我会将它们标记为这样。 – Lucas

+1

你是对的丹尼尔。我简化了这个问题,希望能够快速找到解决方案。 无论如何,我确实发现它,我的错误解释在我的答案下面。谢谢。 – Lucas

回答

1

你的问题可以解释的更好,但据我所知,这是pretyt多,你想要做什么和应工作。

//(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。如果这仍然发生,你在代码的其他地方做错了什么。

+0

你是对的,我做错了什么。为此,你有了复选标记。下面的解释。谢谢 – Lucas

0

情绪得到了我最好的。

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

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

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

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

即使innerTask执行正在运行,并且它returing对象,外任务是处理之前的例外。

一旦我意识到,修复非常简单和容易。