Saya sedang menulis modul dan ingin memiliki hierarki eksepsi terpadu untuk pengecualian yang dapat dimunculkan (misalnya mewarisi dari FooError
kelas abstrak untuk semua foo
pengecualian spesifik modul). Ini memungkinkan pengguna modul untuk menangkap pengecualian khusus tersebut dan menanganinya dengan jelas, jika perlu. Tetapi banyak pengecualian yang diangkat dari modul dinaikkan karena beberapa pengecualian lain; misalnya gagal pada beberapa tugas karena OSError pada file.
Yang saya butuhkan adalah untuk "membungkus" pengecualian yang ditangkap sehingga memiliki jenis dan pesan yang berbeda , sehingga informasi tersedia lebih lanjut atas hierarki propagasi oleh apa pun yang menangkap pengecualian. Tapi saya tidak ingin kehilangan jenis, pesan, dan jejak stack yang ada; itu semua informasi yang berguna untuk seseorang yang mencoba men-debug masalah. Penangan pengecualian tingkat atas tidak baik, karena saya mencoba untuk menghias pengecualian sebelum membuat jalannya lebih jauh ke tumpukan propagasi, dan penangan tingkat atas sudah terlambat.
Ini sebagian diselesaikan dengan menurunkan foo
jenis pengecualian spesifik modul saya dari jenis yang ada (misalnya class FooPermissionError(OSError, FooError)
), tetapi itu tidak membuatnya lebih mudah untuk membungkus contoh pengecualian yang ada dalam jenis baru, atau memodifikasi pesan.
PEP 3134 dari Python 3134 " Chains Pengecualian dan Embedded Tracebacks" membahas perubahan yang diterima dalam Python 3.0 untuk objek pengecualian "chaining", untuk menunjukkan bahwa pengecualian baru dimunculkan selama penanganan pengecualian yang ada.
Apa yang saya coba lakukan terkait: Saya membutuhkannya juga bekerja di versi Python sebelumnya, dan saya membutuhkannya bukan untuk chaining, tetapi hanya untuk polimorfisme. Apa cara yang tepat untuk melakukan ini?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> solusi ini dari pertanyaan SO lainnya . Ini tidak cantik tapi fungsional.