หากคุณโชคดีพอที่จะรองรับ python 3.x ได้เท่านั้นนี่จะกลายเป็นความงาม :)
เพิ่มจาก
เราสามารถโซ่ข้อยกเว้นโดยใช้เพิ่มจาก
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
ในกรณีนี้ข้อยกเว้นที่ผู้โทรจะจับได้จะมีหมายเลขบรรทัดของสถานที่ที่เรายกข้อยกเว้นของเรา
Traceback (most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise Exception('Smelly socks') from e
Exception: Smelly socks
สังเกตว่าข้อยกเว้นด้านล่างจะมีสแต็คติดตามจากที่ที่เรายกข้อยกเว้นของเราขึ้นมา ผู้โทรของคุณยังคงสามารถรับข้อยกเว้นดั้งเดิมได้โดยเข้าถึง__cause__
แอตทริบิวต์ของข้อยกเว้นที่จับได้
with_traceback
หรือคุณสามารถใช้with_traceback
try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
การใช้แบบฟอร์มนี้ข้อยกเว้นที่ผู้โทรจะจับได้มีการย้อนกลับจากที่เกิดข้อผิดพลาดดั้งเดิม
Traceback (most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise Exception('Smelly socks').with_traceback(e.__traceback__)
File "test.py", line 2, in <module>
1 / 0
Exception: Smelly socks
สังเกตว่าข้อยกเว้นด้านล่างมีบรรทัดที่เราทำการหารที่ไม่ถูกต้องเช่นเดียวกับบรรทัดที่เราทำการยกเว้น