2009-12-03 60 views
19

tôi đã sẵn sàng để chạy mã này, nhưng trước khi tôi muốn sửa chữa các xử lý ngoại lệ:Làm thế nào để có được trở lại với vòng lặp for sau khi xử lý ngoại lệ

for l in bios: 
    OpenThisLink = url + l 
    try: 
     response = urllib2.urlopen(OpenThisLink) 
    except urllib2.HTTPError: 
     pass 
    bio = response.read() 
    item = re.search('(JD)(.*?)(\d+)', bio) 
    .... 

Như đã đề cập here, tôi đã thêm các try...except nhưng bây giờ nếu một trang không mở Tôi nhận được lỗi này:

bio = response.read() 
NameError: name 'response' is not defined 

Vì vậy, chương trình tiếp tục thực thi. Thay vào đó, tôi muốn nó quay trở lại vòng lặp for và thử url tiếp theo. Tôi đã thử break thay vì pass nhưng kết thúc chương trình. Bất kỳ đề xuất?

Trả lời

34

Sử dụng continue thay vì break.

Tuyên bố pass là số không (nghĩa là không làm gì cả). Chương trình chỉ tiếp tục tuyên bố tiếp theo, đó là lý do tại sao bạn gặp lỗi.

break thoát khỏi các vòng lặp và tiếp tục chạy từ câu lệnh tiếp theo ngay sau vòng lặp. Trong trường hợp này, không có thêm tuyên bố, đó là lý do tại sao chương trình của bạn chấm dứt.

continue khởi động lại vòng lặp nhưng với mục tiếp theo. Đây chính là điều bạn muốn.

+5

Sau một ngoại lệ được xử lý nó trở về nơi nó đã bị bắt, giống như hầu hết các burger. – jathanism

+0

cảm ơn. 'tiếp tục' hoạt động tốt. – Zeynel

+2

@jathanism: không, không. Nếu bạn không 'nâng cấp nó một lần nữa hoặc một cái gì đó, nó sẽ tiếp tục câu lệnh sau khối' except'. – drevicko

10

Hãy thử thực sự là cách mạnh mẽ hơn thế. Bạn cũng có thể sử dụng khối khác tại đây:

try: 
    stuff 
except Exception: 
    print "oh no a exception" 
else: 
    print "oh yay no exception" 
finally: 
    print "leaving the try block" 
+0

Đây là xử lý ngoại lệ chính xác dẫn tôi đến giải pháp của tôi. Cảm ơn! – Rockbar

1

bạn nhận được lỗi đó vì khi ngoại lệ được ném biến trả lời không tồn tại. Nếu bạn muốn để lại các mã như thế nào bạn có nó, bạn sẽ cần phải kiểm tra xem phản ứng tồn tại trước khi gọi đọc

if response: 
    bio = response.read() 
    ... 

có nói rằng tôi đồng ý với Mark rằng continue là một gợi ý tốt hơn so với pass

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