Làm cách nào để tôi bắt được nhiều ngoại lệ trong một dòng (ngoại trừ khối)
Làm cái này:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
Các dấu ngoặc đơn được yêu cầu do cú pháp cũ hơn đã sử dụng dấu phẩy để gán đối tượng lỗi cho tên. Các as
từ khóa được sử dụng cho bài tập. Bạn có thể sử dụng bất kỳ tên nào cho đối tượng lỗi, tôi thích error
cá nhân hơn.
Thực hành tốt nhất
Để thực hiện điều này theo cách tương thích hiện tại và chuyển tiếp với Python, bạn cần tách Ngoại lệ bằng dấu phẩy và bọc chúng bằng dấu ngoặc đơn để phân biệt với cú pháp trước đó đã gán đối tượng ngoại lệ cho một tên biến bằng cách theo loại Ngoại lệ được bắt với dấu phẩy
Đây là một ví dụ về cách sử dụng đơn giản:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
Tôi chỉ xác định những ngoại lệ này để tránh ẩn lỗi, nếu tôi gặp phải tôi mong đợi dấu vết ngăn xếp đầy đủ từ đó.
Điều này được ghi lại ở đây: https://docs.python.org/tutorial/errors.html
Bạn có thể gán ngoại lệ cho một biến, ( e
là phổ biến, nhưng bạn có thể thích biến dài hơn nếu bạn xử lý ngoại lệ dài hoặc IDE của bạn chỉ làm nổi bật các lựa chọn lớn hơn, như của tôi.) Ví dụ có thuộc tính args. Đây là một ví dụ:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
Lưu ý rằng trong Python 3, err
đối tượng rơi ra khỏi phạm vi khi except
khối được kết thúc.
Không dùng nữa
Bạn có thể thấy mã gán lỗi bằng dấu phẩy. Cách sử dụng này, biểu mẫu duy nhất có sẵn trong Python 2.5 trở về trước, không được chấp nhận và nếu bạn muốn mã của mình tương thích về phía trước trong Python 3, bạn nên cập nhật cú pháp để sử dụng biểu mẫu mới:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
Nếu bạn thấy việc gán tên dấu phẩy trong cơ sở mã của bạn và bạn đang sử dụng Python 2.5 trở lên, hãy chuyển sang cách làm mới để mã của bạn vẫn tương thích khi bạn nâng cấp.
Người suppress
quản lý bối cảnh
Câu trả lời được chấp nhận thực sự là 4 dòng mã, tối thiểu:
try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
Các try
, except
, pass
đường có thể bị xử lý theo một đường duy nhất với các nhà quản lý bối cảnh đàn áp, có sẵn trong Python 3.4 :
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
Vì vậy, khi bạn muốn pass
trên một số ngoại lệ nhất định, sử dụng suppress
.