หากคุณดูเอกสารสำหรับข้อผิดพลาดในตัวคุณจะเห็นว่าExceptionชั้นเรียนส่วนใหญ่กำหนดอาร์กิวเมนต์แรกเป็น amessageแอตทริบิวต์ ไม่ใช่ทั้งหมดที่ทำ
ยวดEnvironmentError(กับ subclasses IOErrorและOSError) มีอาร์กิวเมนต์แรกของสองของerrno strerrorไม่มีmessage... strerrorมีความคล้ายคลึงกับสิ่งที่ปกติจะเป็นmessage .
โดยทั่วไปคลาสย่อยExceptionสามารถทำอะไรก็ได้ที่ต้องการ อาจมีหรือไม่มีmessageแอตทริบิวต์ ในอนาคตExceptionอาจไม่มีmessageแอตทริบิวต์ Exceptionคลาสย่อยใด ๆ ที่นำเข้าจากไลบรารีของบุคคลที่สามหรือรหัสผู้ใช้อาจไม่มีmessageแอตทริบิวต์
ฉันคิดว่าวิธีที่เหมาะสมในการจัดการสิ่งนี้คือการระบุExceptionคลาสย่อยเฉพาะที่คุณต้องการจับจากนั้นจับเฉพาะคลาสเหล่านั้นแทนที่จะเป็นทุกอย่างด้วย an except Exceptionจากนั้นใช้แอตทริบิวต์ใด ๆ ที่คลาสย่อยเฉพาะกำหนดตามที่คุณต้องการ
ถ้าคุณต้องมีprintบางอย่างฉันคิดว่าการพิมพ์ที่จับได้Exceptionนั้นมักจะทำในสิ่งที่คุณต้องการไม่ว่าจะมีmessageคุณลักษณะหรือไม่
นอกจากนี้คุณยังสามารถตรวจสอบแอตทริบิวต์ข้อความได้หากต้องการเช่นนี้ แต่ฉันจะไม่แนะนำจริงๆเพราะมันดูยุ่ง:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:เหมือนกับexcept Foo, bar:(ยกเว้นสิ่งที่ใหม่กว่าและจะยังคงทำงานใน 3.x) ไม่ว่าข้อผิดพลาดจะมาพร้อมกับmessageแอตทริบิวต์หรือไม่ก็ตาม