我下面举个例子:(也请阅读代码中的注释,因为它会更有意义)异步任务抛出异常,如果没有等待?
public async Task<Task<Result>> MyAsyncMethod()
{
Task<Result> resultTask = await _mySender.PostAsync();
return resultTask;
// in real-life case this returns to a different assembly which I can't change
// but I need to do some exception handling on the Result in here
}
假设的PostAsync
方法_ mySender
看起来是这样的:
public Task<Task<Result>> PostAsync()
{
Task<Result> result = GetSomeTask();
return result;
}
的问题是:
因为我不在等待中的实际Result
,并且如果PostAsync
方法抛出异常,在哪个上下文是要抛出和处理的异常?
和
有什么办法可以处理我的程序集中的异常吗?
我很惊讶,当我试图改变MyAsyncMethod
到:
public async Task<Task<Result>> MyAsyncMethod()
{
try
{
Task<Result> resultTask = await _mySender.PostAsync();
return resultTask;
}
catch (MyCustomException ex)
{
}
}
异常被抓到这里来,事件是否有对应的实际结果没有任何的await。碰巧PostAsync
的结果已经可用,并且在这种情况下抛出异常吗?
是否可以使用ContinueWith
来处理当前类中的异常?例如:
public async Task<Task<Result>> MyAsyncMethod()
{
Task<Result> resultTask = await _mySender.PostAsync();
var exceptionHandlingTask = resultTask.ContinueWith(t => { handle(t.Exception)}, TaskContinuationOptions.OnlyOnFaulted);
return resultTask;
}
您可能想看看TPL的[异常处理](http://msdn.microsoft.com/en-us/library/dd997415(v = vs.110).aspx)页面。 – 2014-09-05 17:56:52