Trong khi câu trả lời của James là hầu như luôn luôn những gì bạn thực sự muốn, nó không hoàn toàn những gì OP yêu cầu:
Có một cách để ngoại trừ bất kỳ ngoại lệ tùy ý và có thể in ra thông điệp ngoại lệ trong khối ngoại trừ?
Exception
không thực sự xử lý tất cả trường hợp ngoại lệ, chỉ cần tất cả các trường hợp ngoại lệ bạn thường muốn bắt. Cụ thể, trong phiên bản 2.5 trở lên:
Tất cả ngoại lệ tích hợp, không có hệ thống được lấy từ lớp này. Tất cả các ngoại lệ do người dùng định nghĩa cũng phải được lấy từ lớp này.
này lá ra một vài điều:
- built-in ngoại lệ hệ thống thoát, giống như một
KeyboardInterrupt
từ người sử dụng đánh ^C
(2.5 và sau đó chỉ)
- ngoại lệ do người dùng định nghĩa rằng don Không tuân theo điều đó "nên"
Rất thường xuyên, bạn muốn xử lý những thứ như KeyboardInterrupt
, trong trường hợp này bạn sử dụng BaseException
thay vì Exception
.(Xem Exception hierarchy cho một danh sách trong đó trường hợp ngoại lệ là và không Exception
lớp con.) Vì vậy:
try:
# stuff
except BaseException as e:
print e
Và (thường là tạm thời trong khi gỡ lỗi) đôi khi bạn thực sự muốn xử lý hoàn toàn tất cả mọi thứ. Trong 2.7, bao gồm các ngoại lệ được định nghĩa là các lớp kiểu cũ; trong 2,5 và trước đó, nó cũng bao gồm các chuỗi. Cách duy nhất để xử lý tất cả những khả năng là sử dụng một trần except
và sau đó sử dụng sys.exc_info
(và, tùy chọn, tái raise
bất cứ điều gì bạn không muốn để xử lý):
try:
# stuff
except:
type, value, traceback = sys.exc_info()
print value
Như một mặt lưu ý, tôi đang sử dụng cú pháp except
kiểu mới (except Exception as e
) ở trên. Điều này hoạt động trong phiên bản 2.6 trở lên, bao gồm 3.x. Cú pháp kiểu cũ (except Exception, e
) không được dùng nữa trong phiên bản 2.6 và ngừng hoạt động ở 3.0, nhưng nếu bạn muốn làm việc với các phiên bản 2.x cũ hơn, bạn cần sử dụng nó.
Lưu ý rằng cú pháp 'Ngoại lệ, e' không được dùng nữa là 2.6 và ngừng hoạt động ở mức 3.0. Nếu bạn có mã phải làm việc với cả 2.x và 3.x, hãy sử dụng 'Exception as e' để thay thế. (Tuy nhiên, nếu bạn cần làm việc với 2.5 hoặc trước đó, bạn phải sử dụng cú pháp này.) – abarnert