2012-02-14 32 views
12

Tôi muốn thực hiện lại mã trong khối thử sau khi một ngoại lệ bị bắt. Điều đó có thể bằng cách nào đó?Có thể thực hiện lại mã trong khối thử sau khi ngoại lệ bị bắt trong khối catch không?

Đối với Ví dụ:

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

Nếu ngoại lệ được bắt tôi muốn đi trong khối try một lần nữa để "thực hiện một số mã" và cố gắng một lần nữa để thực hiện nó.

+0

không, không phải là một built-in cách tiêu chuẩn, nhưng bạn có thể xây dựng riêng –

+0

trùng lặp càng tốt bạn [try/catch ngoại lệ tiếp tục từ dòng gây ra ngoại lệ] (http://stackoverflow.com/câu hỏi/7125352/try-catch-exception-tiếp tục-từ-line-mà-gây ra-ngoại lệ), [Try-Catch và "Tiếp tục" - là điều này có thể?] (http://stackoverflow.com/questions/6146248/try-catch-and-continue-is-this-possible), [Catch and Continue] (http://stackoverflow.com/questions/7113929/catch-and-continue) –

+1

@SunilKumarBM hữu ích khi thực hiện cuộc gọi đến một trang web/dịch vụ web tinh vi, thường xuyên bị lỗi 500 lần. – SynXsiS

Trả lời

25

Đặt trong vòng lặp. Có thể là một vòng lặp while xung quanh cờ boolean để kiểm soát khi bạn cuối cùng muốn thoát.

bool tryAgain = true; 
while(tryAgain){ 
    try{ 
    // execute some code; 
    // Maybe set tryAgain = false; 
    }catch(Exception e){ 
    // Or maybe set tryAgain = false; here, depending upon the exception, or saved details from within the try. 
    } 
} 

Chỉ cần cẩn thận để tránh vòng lặp vô hạn.

Một cách tiếp cận tốt hơn có thể là đặt "một số mã" trong phương pháp riêng của nó, sau đó bạn có thể gọi phương thức từ cả hai trong thử và nắm bắt khi thích hợp.

0

này nên làm việc:

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

tại sao sử dụng cờ, bạn đang chạy vòng lặp for tại đây. vì vậy hãy sử dụng cấu trúc vòng lặp for. –

3

Nếu bạn quấn khối của bạn trong một phương pháp, bạn đệ quy có thể gọi nó

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

hoặc bạn có thể làm điều đó trong một vòng lặp.

int retries = 0; 

while(true) 
{ 
    try 
    { 
     ... 
     break; // exit the loop if code completes 
    } 
    catch(Exception e) 
    { 
     if (retries < maxRetries) 
      retries++; 
     else 
      throw; 
    } 
} 
+3

Và sau đó bạn cũng có thể chạy vào stackoverflow do không có điểm cuối. –

1

Có một cách khác để thực hiện (mặc dù những người khác đã đề cập, không thực sự được đề xuất). Dưới đây là một ví dụ sử dụng tải xuống tệp thử lại để khớp chặt chẽ hơn với từ khóa retry được tìm thấy trong Ruby trong VB6.

RetryLabel: 

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

sử dụng nhãn không phải là một thực hành mã hóa tốt –

+3

Dường như rõ ràng hơn nhiều so với các vòng lặp đệ quy hoặc vô hạn để giải quyết vấn đề cụ thể này. – Bill

+1

Thật không may, đó là chính xác những gì bạn có khả năng thực hiện ở đây - một vòng lặp vô hạn. Nếu ngoại lệ xảy ra, và không có gì được thực hiện để giải quyết nguyên nhân cơ bản, không có truy cập thử lại hoặc như vậy để ngăn chặn vòng lặp. Kiểm tra 'ex.OkToRetry' có thể là một sự khởi đầu cho điều này, nhưng không rõ liệu có hay không nơi nào sẽ được đặt khác nhau giữa' true' và 'false'. – ziesemer

0

Có gì sai với ole goto?

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 
    } 
} 
Các vấn đề liên quan