2013-05-17 50 views
9

Tôi có hàm Python gọi là plot_pdf(f) có thể gây ra lỗi. Tôi sử dụng danh sách hiểu để lặp qua danh sách các tệp trên hàm này:Xử lý ngoại lệ Python trong danh sách hiểu

[plot_pdf(f) for f in file_list] 

Tôi muốn sử dụng khối try-except để bỏ qua mọi lỗi có thể xảy ra trong vòng lặp lặp lại và tiếp tục với tệp tiếp theo. Vì vậy, đoạn code sau đây đúng cách để làm việc xử lý ngoại lệ trong Python list comprehension?

try: 
    [plot_pdf(f) for f in file_list] # using list comprehensions 
except: 
    print ("Exception: ", sys.exc_info()[0]) 
    continue 

Mã trên có chấm dứt vòng lặp hiện tại và chuyển sang lần lặp tiếp theo không? Nếu tôi không thể sử dụng danh sách hiểu để bắt lỗi trong quá trình lặp đi lặp lại, sau đó tôi phải sử dụng bình thường for loop:

for f in file_list: 
    try: 
     plot_pdf(f) 
    except: 
     print("Exception: ", sys.exc_info()[0]) 
     continue 

Tôi muốn biết nếu tôi có thể sử dụng thử-ngoại trừ để làm xử lý ngoại lệ trong danh sách hiểu.

+5

"Tôi sử dụng một danh sách hiểu biết để lặp qua một danh sách các tập tin trên chức năng này" * ho * * ho * ** ** COUGHCHOKERETCH –

+3

Trừ khi bạn là sử dụng danh sách được tạo ra bởi danh sách hiểu, gắn bó với vòng lặp for. – chepner

+0

Có gì sai với vòng lặp 'for'? –

Trả lời

12
try: 
    [plot_pdf(f) for f in file_list] # using list comprehensions 
except: 
    print ("Exception: ", sys.exc_info()[0]) 
    continue 

Nếu plot_pdf(f) ném một lỗi trong quá trình thực hiện sự hiểu biết, sau đó, nó được bắt trong mệnh đề except, các mặt hàng khác trong sự hiểu biết sẽ không được đánh giá.

Không thể xử lý ngoại lệ trong danh sách hiểu, để hiểu danh sách là biểu thức chứa biểu thức khác, không có gì khác (tức là không có câu lệnh và chỉ câu lệnh có thể bắt/bỏ qua/xử lý ngoại lệ).

Chức năng cuộc gọi là một biểu hiện, và các cơ quan chức năng có thể bao gồm tất cả những điều khoản mà bạn muốn, vì vậy giao phó việc thẩm định ngoại lệ dễ bị tiểu biểu cho một hàm, như bạn đã thấy, là một cách giải quyết khả thi (những người khác, khi khả thi, là các kiểm tra về các giá trị có thể gây ra các ngoại lệ, cũng như được đề xuất trong các câu trả lời khác).

More here.

+0

Cảm ơn. Điều này giúp tôi hiểu thêm về việc hiểu danh sách. – tonga

6

Bạn đang mắc kẹt với vòng lặp for trừ khi bạn xử lý lỗi bên trong plot_pdf hoặc trình bao bọc.

def catch_plot_pdf(f): 
    try: 
     return plot_pdf(f) 
    except: 
     print("Exception: ", sys.exc_info()[0]) 

[catch_plot_pdf(f) for f in file_list] 
+0

Tôi có một số xử lý ngoại lệ bên trong 'plot_pdf()'. Nhưng điều đó không bắt được tất cả các lỗi. Vì vậy, tôi muốn sử dụng xử lý ngoại lệ bên ngoài danh sách hiểu. Tôi chỉ muốn biết liệu khối try-except có ảnh hưởng đến việc hiểu danh sách hay không. Nếu không, sau đó tôi chỉ có thể sử dụng thường xuyên cho vòng lặp để bắt ra hầu hết các trường hợp ngoại lệ. – tonga

+1

Vì vậy, hãy sử dụng vòng lặp thông thường. –

1

Bạn có thể tạo một đối tượng catch

def catch(error, default, function, *args, **kwargs): 
    try: return function(*args, **kwargs) 
    except error: return default 

Sau đó, bạn có thể làm

# using None as default value 
result (catch(Exception, None, plot_pdf, f) for f in file_list) 

Và sau đó bạn có thể làm những gì bạn muốn với kết quả:

result = list(result) # turn it into a list 
# or 
result = [n for n in result if n is not None] # filter out the Nones 

Đáng tiếc là điều này sẽ không được thậm chí từ xa C tốc độ, see my question here