2016-06-24 12 views
1

私はこのコードを持っている:await非同期タスクで例外を再発行しますか?

try 
{ 
    await Task.Run(() => 
    { 
     token.ThrowIfCancellationRequested(); 
     //Call WebApi... 
    }, token); 
} 
catch (OperationCanceledException oex) 
{ } 
catch 
{ 
    throw; 
} 

方法は、コード200を返すか、私は評価したい特定の例外がスローされますのいずれか。

アクションがキャンセル可能であるため、OperationCanceledExceptionがスローされる可能性があり、無視したいだけです。

上記はうまくいくはずです。ただし、whenを使用して、catchステートメントと新しいC#6.0構文を統合することは可能ですか?

あなただけの最後のcatchブロックを取り除くと、あなたがC#6でやりたいかもしれないだけ OperationCanceledException

try 
{ 
    await Task.Run(() => 
    { 
     token.ThrowIfCancellationRequested(); 
     //Call WebApi... 
    }, token); 
} 
catch (OperationCanceledException oex) 
{ } 

を持って一つのことだったトークンかどうかを確認されます、C#6を必要としない

+0

に渡されたトークンですこれを見てみました:http://druss.co/2015/05/c-6-0-exception-filters-try-catch-when/? – Appelemac

答えて

1

excptionを上げるために使用されるあなたは

try 
{ 
    await Task.Run(() => 
    { 
     token.ThrowIfCancellationRequested(); 
     //Call WebApi... 
    }, token); 
} 
catch (OperationCanceledException oex) when (oex.CancellationToken == token) 
{ } 

か、古いスタイルを使用して

try 
{ 
    await Task.Run(() => 
    { 
     token.ThrowIfCancellationRequested(); 
     //Call WebApi... 
    }, token); 
} 
catch (OperationCanceledException oex) 
{ 
    if(oex.CancellationToken != token) 
     throw; 
} 
+0

webapiメソッドからスローされた正確な例外を評価する必要があるので、2番目の提案は元の例外を "そのまま"再起するでしょうか? –

+0

はい、 'when'でマッチしなかった例外は、変更されていない次のtry/catchブロックにバブルアップします。 'when'を使うと、あなたの特定のケースで古いスタイルを上回る恩恵を実際に与えることはできません。C#5ではできない何かの利点を得る唯一の方法は、"すべてをキャッチする "例外、例えばロギング。 'when'を使用すると、デフォルトのキャッチブロックに移動するための' OperationCanceledException'を得ることができます。古いスタイルでは、デフォルトのキャッチブロックと 'OperationCanceledException'のキャッチの両方にロギングコードを記述する必要があります。 –

関連する問題