Ich habe folgenden Code:
WebClient wc = new WebClient();
string result;
try
{
result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) );
}
catch
{
result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) );
}
Grundsätzlich möchte ich von einer URL herunterladen und wenn es mit einer Ausnahme fehlschlägt, möchte ich von einer anderen URL herunterladen. Beide Male natürlich asynchron. Der Code wird jedoch aufgrund von nicht kompiliert
Fehler CS1985: Kann im Hauptteil einer catch-Klausel nicht warten
OK, es ist aus irgendeinem Grund verboten, aber wie lautet das richtige Codemuster hier?
BEARBEITEN:
Die gute Nachricht ist, dass C # 6.0 wahrscheinlich das Warten auf Anrufe sowohl im Catch- als auch im Endblock ermöglicht .
c#
asynchronous
async-await
c#-5.0
c#-6.0
György Balássy
quelle
quelle
svick
der Antwort ist jedoch sauberer als der Code mit Fortsetzungen.System.Runtime.ExceptionServices.ExceptionDispatchInfo
statische Klasse verwenden. RufenExceptionDispatchInfo.Capture(ex)
Sie einfach Ihren catch-Block auf und speichern Sie den Rückgabewert, die erfasste Ausnahme, in einer lokalen Variablen. Sobald Sie mit Ihrem asynchronen Code fertig sind, können Sie verwenden,capturedException.Throw()
wodurch die ursprüngliche Ausnahme ordnungsgemäß erneut ausgelöst wird.Das Warten in einem Catch-Block ist jetzt ab der hier gezeigten Endbenutzer-Vorschau von Roslyn möglich (aufgeführt unter Await in catch / finally) und wird in C # 6 aufgenommen.
Das aufgeführte Beispiel ist
Update: Neuerer Link hinzugefügt, und dass es in C # 6 sein wird
quelle
Das scheint zu funktionieren.
quelle
Probieren Sie es aus:
(Siehe das
Wait()
Ende)quelle
Verwenden Sie C # 6.0. siehe diesen Link
quelle
Das Muster, mit dem ich die Ausnahme nach dem Warten auf eine Fallback-Aufgabe erneut auslöse:
quelle
Sie können einen Lambda-Ausdruck wie folgt verwenden:
quelle
async void
, das nicht verwendet werden sollte, es sei denn, Sie müssen.Sie können das
await
nach dem catch-Block gefolgt von alabel
setzen und eingoto
in den try-Block setzen. (Nein, wirklich! Goto ist nicht so schlimm!)quelle
In einem ähnlichen Fall konnte ich nicht in einem Fangblock warten. Ich konnte jedoch ein Flag setzen und das Flag in einer if-Anweisung verwenden (Code unten).
---------------------------------------...
quelle