2012-02-14 12 views
12

Kural dışı durum yakalandıktan sonra, kod blok tekrar yürütmek istiyorum. Bu bir şekilde mümkün mü? Örn içinYakalama bloğunda yakalanan bir istisna sonrasında kodu tekrar blokta yürütmek mümkün mü?

: istisna Ben "bazı kod yürütmesine" ve çalıştırmak için yeniden denemek için tekrar deneyin bloğunda gitmek istiyorum yakalandı edilirse

try 
{ 
    //execute some code 
} 
catch(Exception e) 
{ 
} 

.

+0

hayır, standart bir şekilde inşa edilmiş, ancak [duruma neden satırından/devam Yakalama istisna deneyin] kendi –

+0

olası yinelenen (inşa edebilirsiniz http://stackoverflow.com/questions/7125352/try-catch-exception-devam-on-line-neden-istisna-istisna), [Try-Catch ve "Devam" - Bu mümkün mü?] (http://stackoverflow.com/questions/6146248/try-catch-ve-devam-bu-mümkün-olduğu), [yakalama ve devam] (http://stackoverflow.com/questions/7113929/catch-and-continue) –

+1

@SunilKumarBM kullanışlı bir arama yaparken sık sık hatta zaman zaman 500 hataları atıyor tehlikeli web sitesi/webservice. – SynXsiS

cevap

25

Bir döngüye koyun. Sonunda çıkmak istediğinizde kontrol etmek için boolean bayrağı etrafında bir süre döngü.

Sadece sonsuz bir döngüden kaçınmaya dikkat edin.

Daha iyi bir yaklaşım o zaman hem denemede ve uygun catch içinde yöntemini diyebiliriz, kendi yöntemine içinde "bazı kod" koymak olabilir. Bir stilini blok sarın Eğer

count = 0; 
while (!done) { 
    try{ 
    //execute some code; 
    done = true; 
    } 
    catch(Exception e){ 
    // code 
    count++; 
    if (count > 1) { done = true; } 
    } 
} 
0

Bu çalışması gerekir.

+0

neden bayraklar kullanıyorsunuz, burada bir for döngüsü kullanıyorsunuz. bu yüzden bir döngü yapısı kullanın. –

3

, özyinelemeli bunu

void MyMethod(type arg1, type arg2, int retryNumber = 0) 
{ 
    try 
    { 
     ... 
    } 
    catch(Exception e) 
    { 
     if (retryNumber < maxRetryNumber) 
      MyMethod(arg1, arg2, retryNumber+1) 
     else 
      throw; 
    } 
} 

nolu telefona veya bir döngü içinde yapabileceğini:

+3

Ve sonra hiçbir uç noktadan dolayı yığın akışına da geçebilirsiniz. –

1

Bunu yapmanın başka bir yolu da vardır (başkalarının belirttiği gibi, gerçekten önerilmez). İşte bir dosya indirmeyi kullanan bir örnek, Ruby in VB6 içinde bulunan retry anahtar sözcüğünü daha yakından eşleştirmek için tekrar deneyin. Zaten bu (ve diğer) cevap

RetryLabel: 

try 
{ 
    downloadMgr.DownLoadFile("file:///server/file", "c:\\file"); 
    Console.WriteLine("File successfully downloaded"); 
} 
catch (NetworkException ex) 
{ 
    if (ex.OkToRetry) 
     goto RetryLabel; 
} 
+0

etiketi kullanmak iyi bir kodlama uygulaması değildir –

+3

Bu sorunu çözmek için yineleme veya sonsuz döngülerden çok daha net görünüyor. – Bill

+1

Ne yazık ki, burada potansiyel olarak başardığınız şey budur - sonsuz bir döngü. Kural dışı durum ortaya çıkarsa ve temel nedeni çözmek için hiçbir şey yapılmazsa, yeniden deneme sayacı veya döngüyü durdurmak için böyle bir işlem yoktur. 'Ex.OkToRetry' denetimi buna bir başlangıç ​​olabilir, ancak bunun "true" ve "false" arasında farklı bir şekilde ayarlanıp ayarlanmayacağı açık değildir. – ziesemer

0

bağlantılar?

Start: 
      try 
      { 
       //try this 
      } 
      catch (Exception) 
      { 

       Thread.Sleep(1000); 
       goto Start; 
      } 
0
int tryTimes = 0; 
while (tryTimes < 2) // set retry times you want 
{ 
    try 
    { 
     // do something with your retry code 
     break; // if working properly, break here. 
    } 
    catch 
    { 
     // do nothing and just retry 
    } 
    finally 
    { 
     tryTimes++; // ensure whether exception or not, retry time++ here 
    } 
} 
İlgili konular