2016-06-24 15 views
1

Ich habe diesen Code:Wiederholungsausnahme mit asynchroner Aufgabe?

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

Verfahren innerhalb await liefert entweder Code 200 oder wirft eine besondere Ausnahme, die ich auswerten möchten.

Da die Aktion abbrechen kann, wird möglicherweise ein OperationCanceledException ausgelöst und ich möchte es nur ignorieren.

Das obige sollte funktionieren. Ist es jedoch möglich, beide catch-Anweisungen mit der neuen C# 6.0-Syntax unter Verwendung von when zu konsolidieren?

+0

versucht, dies zu betrachten: http://druss.co/2015/05/c-6-0-exception-filter-try-catch-when/? – Appelemac

Antwort

1

Sie brauchen nicht C# 6, nur um des letzten catch-Block zu befreien und haben nur die OperationCanceledException

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

Das Einzige, was Sie vielleicht mit C# 6 tun möchte, ist zu prüfen, ob das Token, das war zu erhöhen ist die excption das Token Sie in

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

Oder mit dem alten Stil verwendet

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

Würde der zweite Vorschlag die ursprüngliche Ausnahme "wie sie ist" erneut ausführen, da ich die genaue Ausnahme, die von der Webapi-Methode ausgelöst wurde, evaluieren muss? –

+0

Ja, jede Ausnahme, die nicht im 'when' übereinstimmt, wird bis zum nächsten try/catch-Block unmodifiziert. Wenn Sie 'when' verwenden, bedeutet das für Ihren speziellen Fall keine Vorteile gegenüber dem alten Stil. Die einzige Möglichkeit, etwas von C# 5 zu vermeiden, ist, dass Sie in der Ausnahme" catch all "zusätzliche Arbeit geleistet haben zum Beispiel Protokollierung. Mit dem 'when' könnten Sie eine' OperationCanceledException' erhalten, um zu Ihrem Standard-catch-Block zu gelangen. Beim alten Stil müssten Sie Ihren Logging-Code sowohl im Standard-catch-Block als auch im Catch für 'OperationCanceledException' schreiben. –