ความแตกต่างคือว่าเมื่อคุณใช้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
ดูเอกสารประกอบข้อยกเว้นในตัวสำหรับรายละเอียดเกี่ยวกับบริบทและทำให้ข้อมูลที่แนบมากับข้อยกเว้น