2009-02-22 31 views
239

Tôi có một thử ... ngoại trừ khối trong mã của tôi và Khi một ngoại lệ là ném. Tôi thực sự chỉ muốn tiếp tục với mã vì trong trường hợp đó, mọi thứ vẫn có thể chạy tốt. Vấn đề là nếu bạn rời khỏi ngoại trừ: khối trống hoặc không có gì, nó sẽ cho bạn một lỗi cú pháp. Tôi không thể sử dụng tiếp tục vì nó không trong vòng lặp. Có một từ khóa tôi có thể sử dụng mà nói với mã để chỉ tiếp tục đi?Python: Làm thế nào để bỏ qua một ngoại lệ và tiến hành?

Trả lời

359
except: 
    pass 
+64

ngoại trừ Ngoại lệ: vượt qua # quan trọng không được nuốt các ngoại lệ khác! –

+8

@Aaron - Tôi đồng ý, nhưng câu hỏi không phải là nếu đây là ý tưởng tốt/xấu – David

+15

Điều này sẽ bắt SystemExit, KeyboardInterrupt và những thứ khác mà bạn có thể không muốn bắt. – FogleBird

12

Hãy thử điều này:

try: 
    blah() 
except: 
    pass 
202

Tiêu chuẩn "nop" bằng Python là pass tuyên bố:

try: 
    do_something() 
except Exception: 
    pass 

Vì ném ngoại lệ cuối cùng được nhớ đến bằng Python, một số các các đối tượng liên quan đến câu lệnh ném ngoại lệ được lưu giữ trực tiếp vô thời hạn (thực tế, cho đến khi ngoại lệ tiếp theo). Trong trường hợp này là quan trọng đối với bạn và (thường), bạn không cần phải nhớ những ngoại lệ ném cuối cùng, bạn có thể muốn làm như sau thay vì pass:

try: 
    do_something() 
except Exception: 
    sys.exc_clear() 

này xóa ném ngoại lệ cuối cùng.

+26

Đây là câu trả lời tốt hơn câu trả lời được chấp nhận bởi vì nó sử dụng "ngoại trừ ngoại lệ:" thay vì chỉ "ngoại trừ:" như những người khác đã chỉ ra sẽ nuốt nhầm những thứ khác mà bạn không muốn bắt như SystemExit và KeyboardInterrupt . – aculich

+4

+1 Nó cũng xóa các lỗi đó là quan trọng khi chạy unittests và mong đợi ngoại lệ – geographika

+0

Lưu ý rằng 'exc_clear' đã được gỡ bỏ trong python 3. https: // docs.python.org/3/whatsnew/3.0.html#index-22. Đối với một số cách để giải quyết điều này trong Python 3 xem tại đây: https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/ – bcattle

114

Có một cách mới để làm được điều này sắp tới trong Python 3.4:

from contextlib import suppress 

with suppress(Exception): 
    # your code 

Đây là cam kết rằng thêm nó: http://hg.python.org/cpython/rev/406b47c64480

Và đây là tác giả, Raymond hettinger, nói chuyện về vấn đề này và tất cả các loại độ nóng Python khác (bit có liên quan tại 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go

Nếu bạn muốn mô phỏng từ khóa except trống và cũng bỏ qua những thứ như KeyboardInterrupt - mặc dù bạn thường không - bạn có thể sử dụng with suppress(BaseException).

Chỉnh sửa: Có vẻ như ignored đã được đổi tên thành suppress trước bản phát hành 3.4.

+1

Tôi không chắc chắn tôi thích giải pháp này ... Tôi đoán ý tưởng là chúng tôi đã thay thế 3 dòng chỉ với 1 (thử, ngoại trừ và vượt qua tất cả được hợp nhất thành một.) Điều chính tôi phản đối là cách điều này giới thiệu một từ khóa mới có vẻ minh mẫn điều gì đó bạn có lẽ không nên làm ... có vẻ như bạn nên luôn luôn có ít nhất đăng nhập ngoại lệ bạn đang bắt ... – ArtOfWarfare

+0

Khi một ngoại lệ được nâng lên, nó sẽ tiếp tục mã sau khi try/catch hoặc bất cứ thứ gì nằm ngoài ' with' block? – Mikhail

+1

Điều này tương đương với việc gói mã của bạn trong một 'try ... catch: pass', vì vậy nếu một ngoại lệ được nâng lên bên trong khối, việc thực hiện sẽ tiếp tục sau khi kết thúc khối. –

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