Saya menghadapi situasi di mana saya menangkap jenis pengecualian tertentu, menyemak mesej pengecualian untuk menyemak sama ada ia memang pengecualian yang saya mahu tangkap, dan jika tidak, buang semula pengecualian:
try: # do something exception-prone except FooException as e: if e.message == 'Something I want to handle': # handle the exception else: raise e
Ini berfungsi dengan baik, tetapi ada masalah. Dalam kes di mana saya menaikkan semula pengecualian, pengecualian kini berlaku pada baris di mana saya menaikkannya semula (iaitu pada raise e
), dan bukannya di lokasi asal pengecualian itu berlaku. Ini tidak sesuai untuk nyahpepijat, kerana anda ingin tahu di mana pengecualian asal berlaku.
Jadi soalan saya ialah: Adakah terdapat cara untuk melontar semula atau sebaliknya "melepasi" pengecualian selepas menangkapnya, sambil mengekalkan lokasi pengecualian asal?
NOTA: Jika anda tertanya-tanya apa sebenarnya yang berlaku: Saya menggunakan pernyataan import __import__
动态导入一些模块。我正在捕获 importerror
来优雅地处理任何这些模块不存在的情况。但是,如果这些模块本身包含引发 importerror
di mana saya mahu pengecualian "sebenar" (dari perspektif aplikasi saya) dibangkitkan - dan di tempat asal penyahpepijatan di mana alat terlibat.
Buat ini sahaja:
raise
bukannya raise e
。请参阅关于引发异常的教程部分,以及raise
. Lihat bahagian tutorial tentang Melempar pengecualian dan raise
pernyataan
Atas ialah kandungan terperinci Dalam Python, bagaimana saya boleh menyemak dan kemudian membuang semula pengecualian sambil mengekalkan timbunan panggilan asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!