2010-11-10 36 views
6

Cuối cùng có được thực hiện trong trường hợp này không? Tôi đã viết mã này và không thể quyết định nếu cuối cùng là thực sự thực hiện trong trường hợp này hay không. Tôi thực sự muốn một số giải thích bất kể câu trả lời là gì.Phá vỡ vòng lặp for từ khối catch

foreach(string s in allStrings) 
{ 
    try 
    { 
     //Error happens here 
    } 
    catch(Exception ex) 
    { 
     //Handle exception 
     break; 
    } 
    finally 
    { 
     //Clean up code 
    } 
} 
+13

"Bạn đã thử chưa?" – Alex

+3

Tôi đã chạy thử nghiệm, tôi đã hẹn giờ phải mất bao lâu để tạo câu hỏi này và tôi đã hẹn giờ phải mất bao lâu để đặt ứng dụng đó trong ứng dụng bảng điều khiển và nhấp vào "Chạy". Bàn điều khiển đã thắng. Được rồi tôi đã không thực sự chạy một thử nghiệm nhưng bạn nhận được điểm. :) – RPM1984

+0

[* cough *] (http://stackoverflow.com/questions/4150186/breaking-out-of-a-for-loop-from-a-catch-block/4150190#4150190) –

Trả lời

6

Bạn đã viết 90% mã mà bạn cần trả lời câu hỏi này cho chính mình.

Tiếp tục viết.

+0

+1, tôi sẽ giải thích về điều đó bên dưới (không phải là bản gốc). –

8

Có. Cuối cùng các khối là luôn luôn được thực thi khi điều khiển rời khỏi khối thử hoặc khối catch tương ứng. (Trừ khi có điều gì đó siêu đặc biệt xảy ra, giống như một vụ tai nạn thời gian chạy hoặc sợi bị hủy bỏ.)

2

Có hiệu quả, cuối cùng các khối được gọi là ALWAYS. Đó là lý do họ được đặt tên theo cách đó ...

2

Dựa trên câu trả lời của Matt. Đó là một tổng số overkill thực sự.

Tôi đề xuất thực hiện một việc như thế này và đảm bảo rằng bài kiểm tra đã trôi qua. MSTest không phải là thư viện tốt nhất để thử nghiệm, nhưng nó là "Standard" :)

[TestClass()] 
public class FinalClauseTester 
{ 
    private TestContext testContextInstance; 
    public TestContext TestContext 
    { 
     get 
     { 
      return testContextInstance; 
     } 
     set 
     { 
      testContextInstance = value; 
     } 
    } 

    [TestMethod] 
    [DeploymentItem(@"Something right goes here.")] 
    [DataSource("Something else goes here", "row", somethingOtherSetupCrap)] 
    public void TestFinalClause() 
    { 

     string[] allStrings = {"1", "2", "3", "4", "5"}; 
     int yesCount = 0; 
     foreach(string s in allStrings) 
     { 
      try 
      { 
       //Error happens here 
       throw new Exception(); 
      } 
      catch(Exception ex) 
      { 
       //Handle exception 
       if (yesCount == 3) 
       { 
        break; 
       } 
      } 
      finally 
      { 
       //Clean up code 
       yesCount++; 
      } 
     } 

     // And, at the end of this loop ... 
     Debug.Assert(yesCount = 3); // Or something like this. 
    } 
} 
+1

+1 mặc dù đây là _total_ overkill: P –

+1

Làm điều này trong khi trên biên chế cho một thời hạn chặt chẽ trường là một ý tưởng tồi trong trường hợp cụ thể này; nhận được sử dụng để viết các bài kiểm tra (mặc dù trường hợp này là một quá mức cần thiết) có thể trả hết tại một số tương lai xa xôi. –

+1

Tuyên bố foreach của bạn không có kết thúc '}'. Ngoài ra, vì 'yesCount' bắt đầu bằng 0, kết quả cuối cùng sẽ là' yesCount == 1' kể từ lần đầu tiên thông qua vòng lặp mà bạn đã ném một ngoại lệ được gọi là 'ngắt' kết thúc vòng lặp (sau khi chạy khối cuối cùng). – Trisped

1

Có nó cố gắng thử, sau đó bắt bắt ngoại lệ, và sau đó cuối cùng là những gì cuối cùng kêu gọi cả hai thực hiện bình thường và bắt được ngoại lệ. Tôi nghĩ rằng có một witticism ẩn một nơi nào đó!

Các vấn đề liên quan