ความแตกต่างคือว่าเมื่อคุณใช้fromการ__cause__แอตทริบิวต์การตั้งค่าและมีข้อความระบุว่าข้อยกเว้นได้เกิดโดยตรงจาก หากคุณละเว้นfromแล้วไม่มี__cause__เป็นชุด แต่__context__แอตทริบิวต์อาจจะกำหนดเป็นอย่างดีและ traceback แล้วแสดงให้เห็นบริบทเป็นในระหว่างการจัดการอย่างอื่นที่เกิดขึ้น
การตั้งค่า__context__เกิดขึ้นถ้าคุณใช้raiseในตัวจัดการข้อยกเว้น; หากคุณใช้raiseที่อื่นก็ไม่__context__ได้ตั้งค่าไว้
หากมีการ__cause__ตั้งค่า__suppress_context__ = Trueสถานะจะถูกตั้งค่าในข้อยกเว้น; เมื่อ__suppress_context__มีการตั้งค่าTrueที่__context__จะถูกละเว้นเมื่อพิมพ์ traceback
เมื่อเพิ่มทุนจากการจัดการข้อยกเว้นที่คุณไม่ต้องการที่จะแสดงบริบท (ไม่ต้องการให้ในระหว่างการจัดการข้อยกเว้นอื่นที่เกิดขึ้นข้อความ) แล้วใช้raise ... from Noneชุดการ__suppress_context__True
กล่าวอีกนัยหนึ่ง Python ตั้งค่าบริบทเป็นข้อยกเว้นเพื่อให้คุณสามารถวิปัสสนาที่มีการยกข้อยกเว้นทำให้คุณเห็นว่ามีข้อยกเว้นอื่นถูกแทนที่ด้วยหรือไม่ คุณยังสามารถเพิ่มสาเหตุให้กับข้อยกเว้นทำให้การสืบค้นกลับชัดเจนเกี่ยวกับข้อยกเว้นอื่น ๆ (ใช้ถ้อยคำที่แตกต่างกัน) และบริบทจะถูกละเว้น (แต่ยังสามารถถูกวิปัสสนาเมื่อทำการดีบัก) การใช้raise ... from Noneช่วยให้คุณไม่ต้องพิมพ์บริบท
ดูเอกสารraiseคำสั่ง :
fromประโยคที่ใช้สำหรับการยกเว้นการผูกมัด: ถ้าให้ที่สองการแสดงออกจะต้องเป็นระดับยกเว้นอื่นหรืออินสแตนซ์ซึ่งจากนั้นจะแนบไปกับข้อยกเว้นยกเป็น__cause__แอตทริบิวต์ (ซึ่งสามารถเขียนได้) หากไม่มีการจัดการข้อยกเว้นที่ยกขึ้นข้อยกเว้นทั้งสองจะถูกพิมพ์:
>>> try:
... print(1 / 0)
... except Exception as exc:
... raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
กลไกที่คล้ายกันทำงานโดยปริยายหากมีการยกข้อยกเว้นภายในตัวจัดการข้อยกเว้นหรือ finallyข้อ: ข้อยกเว้นก่อนหน้านี้จะถูกแนบมาเป็น__context__แอตทริบิวต์ของข้อยกเว้นใหม่:
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
ดูเอกสารประกอบข้อยกเว้นในตัวสำหรับรายละเอียดเกี่ยวกับบริบทและทำให้ข้อมูลที่แนบมากับข้อยกเว้น