2012-01-15 11 views
73

Aşağıdaki kod var:catch bloğunda bekliyoruz

WebClient wc = new WebClient(); 
string result; 
try 
{ 
    result = await wc.DownloadStringTaskAsync(new Uri("http://badurl")); 
} 
catch 
{ 
    result = await wc.DownloadStringTaskAsync(new Uri("http://fallbackurl")); 
} 

Temelde ben bir URL'den indirmek istiyorum ve ben başka bir URL'den İndirmek istediğiniz bir istisna ile başarısız olduğunda. Her iki zaman da tabi ki uyumsuz. Kod, çünkü

hata CS1985 ait derleme değil Ancak: Tamam, herhangi bir nedenle yasak ama doğru kod deseni burada ne var

bir catch bloğundaki vücutta bekliyor musunuz?

DÜZENLEME:

iyi haber C# 6.0 will likely allow await calls both in catch and finally blocks olmasıdır.

cevap

87

Güncelleme:C# 6.0 supports await in catch


Eski Cevap:

WebClient wc = new WebClient(); 
string result = null; 
bool downloadSucceeded; 
try 
{ 
    result = await wc.DownloadStringTaskAsync(new Uri("http://badurl")); 
    downloadSucceeded = true; 
} 
catch 
{ 
    downloadSucceeded = false; 
} 

if (!downloadSucceeded) 
    result = await wc.DownloadStringTaskAsync(new Uri("http://fallbackurl")); 
+7

Teşekkür svick, daha iyi bir şey daha bağlı async için? –

+0

Bunun gibi bir şey düşünmüyorum. – svick

+3

Durumunuzda, görev süreklerini de kullanabilirsiniz. Fakat svick'in cevabındaki kod, süreklilikler kullanılarak koddan daha temizdir. –

9

Bu iş gibi görünüyor: Bir bayrak kullanılarak catch bloktan await taşımak için bu kodu yeniden yazabilirsiniz. Bir catch bloğunda Bekleniyor

 WebClient wc = new WebClient(); 
     string result; 
     Task<string> downloadTask = wc.DownloadStringTaskAsync(new Uri("http://badurl")); 
     downloadTask = downloadTask.ContinueWith(
      t => { 
       return wc.DownloadStringTaskAsync(new Uri("http://google.com/")).Result; 
      }, TaskContinuationOptions.OnlyOnFaulted); 
     result = await downloadTask; 
0

Eklendikten sonra await bloğu bir label takip edin ve try bloğuna goto ekleyin. (Hayır, gerçekten! Goto en kötü değildir!) Benzer bir durumda

0

, bir catch bloğunda bekliyor edemedi. Ancak, ben ------------------------

(aşağıda Code) bir bayrak ayarlamak ve bir if açıklamada bayrağını kullanmak başardı

  try 
     { 
      await AsyncFunction(...); 
     } 

     catch(Exception ex) 
     { 
      Utilities.LogExceptionToFile(ex).Wait(); 
      //instead of "await Utilities.LogExceptionToFile(ex);" 
     } 

(Wait() biten bakınız)

4

bu bir deneyin Bir geri dönüş görevinde bekledikten sonra istisnayı yeniden kullanmak için kullanın:

ExceptionDispatchInfo capturedException = null; 
try 
{ 
    await SomeWork(); 
} 
catch (Exception e) 
{ 
    capturedException = ExceptionDispatchInfo.Capture(e); 
} 

if (capturedException != null) 
{ 
    await FallbackWork(); 
    capturedException.Throw(); 
} 
1

kalıbını: ---------------...

boolean exceptionFlag = false; 

try 
{ 
do your thing 
} 
catch 
{ 
exceptionFlag = true; 
} 

if(exceptionFlag == true){ 
do what you wanted to do in the catch block 
} 
2

Kullanımı C# 6.0.aşağıdaki gibi bu Link

public async Task SubmitDataToServer() 
{ 
    try 
    { 
    // Submit Data 
    } 
    catch 
    { 
    await LogExceptionAsync(); 
    } 
    finally 
    { 
    await CloseConnectionAsync(); 
    } 
} 
1

Bir lambda ifade kullanabilirsiniz bkz: bu oldukça açıktır,

try 
    { 
     //..... 
    } 
    catch (Exception ex) 
    { 
     Action<Exception> lambda; 

     lambda = async (x) => 
     { 
      // await (...); 
     }; 

     lambda(ex); 
    } 
+0

Bu, kullanmanız gerekmediği sürece kullanılmaması gereken lambda 'async void' yapar. – svick

İlgili konular