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 Exceptioncác lớp đều gán đối số đầu tiên của chúng làm messagethuộ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 IOErrorvà OSError) có đối số đầu tiên là, đối số errnothứ hai strerror. Không có message... strerrorgầ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 Exceptioncó thể làm bất cứ điều gì chúng muốn. Chúng có thể có hoặc không có messagethuộc tính. Các tích hợp trong tương lai Exceptioncó thể không có messagethuộc tính. Bất kỳ Exceptionlớ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ó messagethuộ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 Exceptionlớ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 Exceptionbản thân nó có nhiều khả năng làm những gì bạn muốn, cho dù nó có messagethuộ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ộtmessagethuộc tính hay không là riêng biệt.