Bir modül yazıyorum ve (örneğin FooError
tüm foo
modülün özel istisnaları için soyut bir sınıftan miras) yükseltebilir istisnalar için birleşik bir istisna hiyerarşisi istiyorum . Bu, modül kullanıcılarının bu özel durumları yakalamasına ve gerektiğinde ayrı ayrı işlemesine olanak tanır. Ancak modülden yapılan istisnaların birçoğu başka bir istisna nedeniyle ortaya çıkar; örneğin, bir dosyadaki OSError nedeniyle bazı görevlerde başarısız olma.
Ihtiyacım ne farklı bir tür ve mesaj olacak şekilde yakalanan istisna "sarmak" , böylece bilgi istisna yakalayan ne tarafından yayılma hiyerarşisinde daha da kullanılabilir. Ama var olan türü, mesajı ve yığın izini kaybetmek istemiyorum; bu, sorunu ayıklamaya çalışan biri için faydalı bilgiler. Bir üst düzey istisna işleyicisi iyi değil, çünkü yayılım yığınını daha da ileriye götürmeden önce istisnayı süslemeye çalışıyorum ve üst düzey işleyici çok geç.
Bu kısmen, modülümün foo
özel istisna türlerini mevcut türden (örn. class FooPermissionError(OSError, FooError)
) Türeterek çözülür , ancak bu, mevcut istisna örneğini yeni bir türe kaydırmayı veya mesajı değiştirmeyi kolaylaştırmaz.
Python'un PEP 3134 “İstisna Zinciri ve Gömülü Geri İzlemeler”, mevcut bir istisnanın işlenmesi sırasında yeni bir istisnanın ortaya çıktığını göstermek için Python 3.0'da “zincirleme” istisna nesneleri için kabul edilen bir değişikliği tartışır.
Yapmaya çalıştığım şey şu: Daha önceki Python sürümlerinde de çalışmam gerekiyor ve zincirleme için değil, sadece polimorfizm için ihtiyacım var. Bunu yapmanın doğru yolu nedir?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> Bu çözüm başka bir SO sorusundan . Bu güzel değil, işlevsel.