Nếu bạn xem tài liệu về các lỗi tích hợp , bạn sẽ thấy rằng hầu hết Exception
các lớp đều gán đối số đầu tiên của chúng làm message
thuộc tính. Không phải tất cả chúng đều như vậy.
Đáng chú ý, EnvironmentError
(với các lớp con IOError
và OSError
) có đối số đầu tiên là, đối số errno
thứ hai strerror
. Không có message
... strerror
gần giống với những gì thường sẽ là a message
.
Nói chung hơn, các lớp con của Exception
có thể làm bất cứ điều gì chúng muốn. Chúng có thể có hoặc không có message
thuộc tính. Các tích hợp trong tương lai Exception
có thể không có message
thuộc tính. Bất kỳ Exception
lớp con nào được nhập từ thư viện của bên thứ ba hoặc mã người dùng có thể không có message
thuộc tính.
Tôi nghĩ rằng cách thích hợp để xử lý điều này là xác định các Exception
lớp con cụ thể mà bạn muốn nắm bắt, sau đó chỉ bắt những người đó thay vì mọi thứ bằng một except Exception
, sau đó sử dụng bất kỳ thuộc tính nào mà lớp con cụ thể xác định theo cách bạn muốn.
Nếu bạn phải làm print
điều gì đó, tôi nghĩ rằng việc in Exception
bản thân nó có nhiều khả năng làm những gì bạn muốn, cho dù nó có message
thuộc tính hay không.
Bạn cũng có thể kiểm tra thuộc tính message nếu bạn muốn, như thế này, nhưng tôi sẽ không thực sự đề xuất nó vì nó có vẻ lộn xộn:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:
giống nhauexcept Foo, bar:
(ngoại trừ cái cũ mới hơn và sẽ tiếp tục hoạt động trong 3.x), cho dù lỗi đi kèm với mộtmessage
thuộc tính hay không là riêng biệt.