2012-05-02 46 views
7

Tôi có một yêu cầu trong dòng chảy chương trình thực hiện nên tiếp tục ngay cả sau khi ném một ngoại lệ.Làm thế nào để tiếp tục thực hiện chương trình ngay cả sau khi ném ngoại lệ?

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { 
    } 
} 

Nếu ngoại lệ được ném trong lần lặp đầu tiên, thực hiện luồng sẽ bị dừng. Yêu cầu của tôi là ngay cả sau khi ném ngoại lệ cho lần lặp đầu tiên, các lặp lại khác sẽ tiếp tục. Tôi có thể viết logic trong khối catch không?

+2

Logic bạn có ở đó hiện thực hiện chính xác điều đó. Nếu ngoại lệ đặt 'DataSource' vào trạng thái không hợp lệ, lần thử tiếp theo để sử dụng trình vòng lặp có thể ném một ngoại lệ khác. –

Trả lời

-3

Không, không có hỗ trợ ngôn ngữ để xử lý ngoại lệ và sau đó quay lại tuyên bố gây ra lỗi đó. Bạn phải quấn riêng các cấu trúc try...catch xung quanh mỗi chuỗi hoạt động sẽ thực thi ngay cả khi các chuỗi trước đó đã ném ra một ngoại lệ.

+1

* "Không, không có hỗ trợ ngôn ngữ để xử lý một ngoại lệ và sau đó nhảy trở lại tuyên bố gây ra nó." * Đó không phải là những gì được hỏi. Những gì được hỏi là làm thế nào để cho phép *** lặp đi lặp lại khác *** để tiếp tục. –

+0

^Đúng. Tôi nghĩ rằng những gì anh ta muốn là một cái gì đó như: thêm một 'cuối cùng' sau khi' bắt' và tiếp tục lặp lại ở đó từ nơi lặp đi lặp lại bị rơi. Mặc dù điều này có thể là một cách giải quyết, nó không được khuyến khích và khá xấu xí để làm. –

6

Nếu bạn không phá vỡ vòng lặp bằng cách nào đó bên trong khối catch, thì các lần lặp lại khác sẽ tiếp tục, bất kể ngoại lệ được ném trong lần lặp trước đó hay chưa.

Hãy thử ví dụ đơn giản này và xem những gì sẽ xảy ra:

List<String> list = new ArrayList<String>(); 
list.add("1"); 
list.add("2"); 
list.add("3"); 

for(String str: list) { 
    try { 
     System.out.println(str); 
     throw new Exception("Exception for string " + str); 
    } catch(Exception ex) { 
     System.out.println("Caught exception"); 
    } 
} 

Bạn sẽ thấy rằng tất cả các lần lặp thực hiện, mặc dù mỗi người ném một ngoại lệ.

+0

Xin chào Tudor, Cảm ơn bạn đã trả lời. Tôi đạt được rồi. tôi cũng cần phải đặt cuối cùng loại khối đó sẽ được gọi là sau khi tất cả các lần lặp. nó không nên được gọi cho mỗi lần lặp lại. làm thế nào tôi có thể đạt được nó? Làm ơn giúp tôi! – user1016403

+0

@ user1016403: Trong trường hợp đó, bạn sẽ cần bọc toàn bộ vòng lặp trong một khối 'try ... finally' như:' try {for (...) {code}} cuối cùng {} ' – Tudor

0

Logic bạn có ở đó hiện thực hiện chính xác điều đó. Nếu ngoại lệ đặt DataSource vào trạng thái không hợp lệ, nỗ lực tiếp theo để sử dụng trình lặp có thể ném một ngoại lệ khác, nhưng đó là một vấn đề khác và một cái gì đó cụ thể cho DataSource (vì vậy, bạn phải xem liệu DataSource với trạng thái không hợp lệ khác theo một cách nào đó). Nhưng trong trường hợp chung, bạn đang làm đúng.

9

Trước hết,

Có 2 loại ngoại lệ. Đã chọn & Không được chọn.

Trường hợp ngoại lệ không được kiểm soát là những ngoại lệ mà chương trình của bạn không thể khôi phục. Giống như NullPointers, nói với bạn rằng có điều gì đó thực sự sai với logic của bạn.

Trường hợp ngoại lệ được kiểm tra là ngoại lệ thời gian chạy và từ những trường hợp ngoại lệ này bạn có thể khôi phục.

Vì vậy, bạn nên tránh sử dụng các biểu đồ bắt để tìm lớp cơ sở "Ngoại lệ". Đó là đại diện cho cả hai lần. Bạn có lẽ nên xem xét tìm kiếm các trường hợp ngoại lệ cụ thể (thường là các lớp con của các ngoại lệ thời gian chạy).

Tóm lại, có nhiều hơn thế nữa.

Bạn cũng nên nhớ rằng bạn không nên sử dụng xử lý ngoại lệ dưới dạng luồng công việc. thường chỉ ra rằng kiến ​​trúc của bạn là bằng cách nào đó thiếu. Và như tên gọi, chúng phải được coi là "ngoại lệ" đối với việc thực hiện bình thường.

Bây giờ, xem xét mã bạn:

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { // catch any exception 
     continue; // will just skip this iteration and jump to the next 
    } 
    //other stuff ? 
} 

Vì nó là, cần nắm bắt những ngoại lệ và di chuyển trên. Có lẽ có điều gì đó bạn không nói với chúng tôi? : P

Dù sao, hy vọng điều này sẽ hữu ích.

1

Nếu một ngoại lệ xảy ra trên for(DataSource source : dataSources) khi gọi dataSources để khởi tạo biến lặp, sau đó rằng ngoại lệ sẽ không bị bắt.

Đó có phải là ý của bạn là "Nếu ngoại lệ được ném trong lần lặp đầu tiên, quá trình thực thi luồng sẽ bị dừng lại."?

Nếu trường hợp này xảy ra, thì bạn không thể làm gì khác và vòng lặp phải không thực hiện bất kỳ giao thoa nào.

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