我下面舉個例子:(也請閱讀代碼中的註釋,因爲它會更有意義)異步任務拋出異常,如果沒有等待?
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