ฉันกำลังเขียนโมดูลและต้องการมีลำดับชั้นข้อยกเว้นแบบรวมสำหรับข้อยกเว้นที่สามารถยกระดับได้ (เช่นการสืบทอดจากFooError
คลาสนามธรรมสำหรับfoo
ข้อยกเว้นเฉพาะทั้งหมดของโมดูล) สิ่งนี้ช่วยให้ผู้ใช้โมดูลสามารถตรวจจับข้อยกเว้นเฉพาะเหล่านั้นและจัดการพวกมันอย่างชัดเจนหากจำเป็น แต่มีข้อยกเว้นมากมายที่ยกมาจากโมดูลเนื่องจากข้อยกเว้นอื่น ๆ เช่นความล้มเหลวในบางงานเนื่องจาก OSError บนไฟล์
สิ่งที่ฉันต้องการคือ"ห่อ" ข้อยกเว้นที่จับได้ว่ามันมีประเภทและข้อความที่แตกต่างกันดังนั้นข้อมูลจะมีอยู่ในลำดับชั้นการเผยแพร่ต่อไปโดยสิ่งใดก็ตามที่จับข้อยกเว้น แต่ฉันไม่ต้องการสูญเสียชนิดข้อความและการติดตามสแต็กที่มีอยู่เดิม นั่นคือข้อมูลที่มีประโยชน์ทั้งหมดสำหรับคนที่พยายามแก้ไขปัญหา ตัวจัดการข้อยกเว้นระดับบนสุดไม่ดีนักเนื่องจากฉันพยายามตกแต่งข้อยกเว้นก่อนที่มันจะเพิ่มระดับสแต็คการเผยแพร่ต่อไปและตัวจัดการระดับบนสุดจะสายเกินไป
นี่เป็นส่วนหนึ่งที่ได้รับการแก้ไขโดยการรับfoo
ประเภทข้อยกเว้นเฉพาะของโมดูลจากประเภทที่มีอยู่ (เช่นclass FooPermissionError(OSError, FooError)
) แต่นั่นไม่ได้ทำให้ง่ายต่อการห่ออินสแตนซ์ข้อยกเว้นที่มีอยู่ในรูปแบบใหม่หรือแก้ไขข้อความ
ธPEP 3134 “ข้อยกเว้นผูกมัดและ tracebacks ฝังตัว” กล่าวถึงการเปลี่ยนแปลงที่ยอมรับในหลาม 3.0 สำหรับ“ผูกมัด” วัตถุข้อยกเว้นที่จะแสดงให้เห็นว่าข้อยกเว้นใหม่ถูกยกขึ้นในระหว่างการจัดการของข้อยกเว้นที่มีอยู่
สิ่งที่ฉันพยายามจะทำคือเกี่ยวข้อง: ฉันต้องการมันยังทำงานในรุ่น Python ก่อนหน้านี้และฉันไม่ต้องการสำหรับการผูกมัด แต่สำหรับ polymorphism เท่านั้น วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> การแก้ปัญหานี้คือจากคำถาม SO อีก มันไม่สวย แต่ใช้งานได้