2009-02-19 74 views
10

Tôi cần vòng lặp for sẽ hoàn thành tất cả các lần lặp của nó ngay cả khi có bất kỳ ngoại lệ nào trong bất kỳ lần lặp nào.Làm thế nào xử lý một ngoại lệ trong một vòng lặp và tiếp tục lặp?

+0

Điều này nghe có vẻ như một câu hỏi chai giày cũ so với chai thủy tinh: http://tinyurl.com/shoevbottle.Bạn có thể muốn cung cấp nhiều chi tiết hơn để có được các giải pháp tốt hơn bao gồm các ý tưởng bạn chưa cân nhắc. – Wedge

+0

Wedge, tôi đồng ý ... nếu bạn phải đặt một thử/nắm bắt bên trong một vòng lặp for, như dưới đây, sau đó một cái gì đó có thể sai với các giải pháp. –

+0

@Wedge: Ẩn dụ tuyệt vời, một dấu trang khác cho tôi, cảm ơn –

Trả lời

31
for (...) 
{ 
    try 
    { 
     // Do stuff 
    } 
    catch (Exception ex) 
    { 
     // Handle (or ignore) the exception 
    } 
} 
+1

Mẹo hiệu suất, đặt các khai báo của bạn bên ngoài vòng lặp for. – freggel

+0

@freggel: haha, cùng mẹo tôi muốn đưa ra. Nhưng đây là giải pháp tốt nhất. – user29964

+0

Mẹo: vui lòng sử dụng Ngoại lệ được xác định chặt chẽ hơn sau đó Ngoại lệ cho biết ApplicationException. một vấn đề lớn với việc bắt ngoại lệ là ThreadAbortException sẽ bị bắt ở đây, bạn có thực sự muốn dừng ứng dụng dừng lại ở đây không? làm thế nào về việc bắt một OutOfMemoryException? –

8

Chỉ cần đặt mỗi lần lặp bên trong một try..catch

foreach(Person a in people) 
{ 
     try 
     { 
       WorkOnPerson(a); 
     } 
     catch 
     { 
       // do something if you want to. 
     } 
} 
-5

Không có tính năng sẵn có trong một vòng lặp để làm điều đó. Đó là không có tính năng ngôn ngữ được xây dựng trong C# sẽ tự động xử lý một ngoại lệ và tiếp tục với một vòng lặp.

Cũng trong phạm vi có thể, vui lòng tránh đặt các khối cố gắng trong vòng lặp. Mặc dù nó giải quyết được vấn đề bạn đề cập đến, hãy xem xét rằng trình biên dịch & thời gian chạy phải thực hiện nhiều công việc bổ sung đó. Nếu không có ngoại lệ nào xảy ra thì tất cả sẽ lãng phí.

Thay vào đó, hãy để ngoại lệ là ngoại lệ. Đó là một cái gì đó xảy ra đặc biệt: bên ngoài những cân nhắc đầu vào được thiết kế của bạn. Tất nhiên, đây chỉ là một gợi ý, nếu bạn thực sự phải tiếp tục vòng lặp, hãy đi với hai tùy chọn được đề xuất ở trên.

+0

Không có tính năng sẵn có? Còn CATCH thì sao? –

+1

Có hay không. Không có thử. , -) – Rytmis

+0

Oh Man! những thứ rõ ràng là không rõ ràng. Tôi đang chỉnh sửa nó. – Sesh

0

Điều này là ... Giải pháp của bạn sẽ phải bao gồm vòng lặp for và một số loại quy trình xử lý lỗi/ngoại lệ, vì vậy bạn có thể phải nhúng câu lệnh try try trong vòng lặp for của bạn.

Nếu ngoại lệ được ném, không có cách nào bạn sẽ hoàn thành một lần lặp lại như bạn sẽ làm nếu ngoại lệ không được ném. Tuy nhiên bằng cách sử dụng một thử bắt bạn có thể chắc chắn rằng vòng lặp của bạn thực hiện tất cả những lần lặp mà không ném ngoại lệ.

Nếu bạn cần trợ giúp khi nhúng xử lý ngoại lệ trong vòng lặp for, chỉ cần sử dụng ví dụ được đăng bởi teedyay!

4

Hoặc, nếu đây là một mô hình lặp đi lặp lại trong chương trình của bạn, và bạn đang dùng các nguy cơ đánh bắt này tất cả các ngoại lệ kiểu, quấn nó như là một phần mở rộng bộ sưu tập của bạn. Áp dụng nó vào ví dụ trước:

people.ForEachIgnorant(ofThrowingWorkOnPerson); 

Hoặc:

people.ForEachIgnorant(p => WorkOnPersonThatThrows(p)); 

Thực hiện:

public static void IgnorantForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    foreach (var item in source) 
    { 
     try 
     { 
      action(item); 
     } 
     catch { } 
    } 
} 
+0

Tốt hơn, hãy thêm một đối số của kiểu 'Hành động ' và gọi nó trong khối catch. Bằng cách này, người gọi có thể xác định cách nó được xử lý và bạn không nuốt các ngoại lệ. – Aaron

0

Tôi nghĩ nó cũng đáng chú ý là nếu bạn đang sử dụng một danh sách chung - bạn có thể sử dụng những điều sau đây để lặp lại bộ sưu tập:

ForEach (Hành động)

http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx

EmployeesList.ForEach(ProcessEmployee); 

    void ProcessEmployee(Employee employeeItem) 
    { 
     try 
     { 
      ... 
     } 
     catch { } 
    } 

này có lợi ích của việc mã trong thể tái sử dụng vòng lặp của bạn.

0

Bạn có biết ngoại lệ là gì và điều gì sẽ gây ra nó? Bạn có thể kiểm tra cho nó và ngăn chặn nó được ném, tức là. CanCompleteStep hoặc TryCompleteStep. nếu bạn không thể hoàn thành chỉ cần bỏ qua bước đó. Sau đó bạn có thể đặt xử lý ngoại lệ ra khỏi vòng lặp.

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