J'écris un module et je souhaite avoir une hiérarchie d'exceptions unifiée pour les exceptions qu'il peut soulever (par exemple, en héritant d'une exception de type FooError
classe abstraite pour tous les foo
les exceptions spécifiques du module). Cela permet aux utilisateurs du module d'attraper ces exceptions particulières et de les traiter séparément, si nécessaire. Mais la plupart des exceptions soulevées par le module le sont à cause d'une autre exception ; par exemple, l'échec d'une tâche à cause d'une OSError sur un fichier.
Ce dont j'ai besoin, c'est de "envelopper" l'exception capturée de manière à ce qu'elle ait un type et un message différents afin que l'information soit disponible plus haut dans la hiérarchie de propagation, quel que soit l'élément qui capture l'exception. Mais je ne veux pas perdre le type, le message et la trace de pile existants ; ce sont toutes des informations utiles pour quelqu'un qui essaie de déboguer le problème. Un gestionnaire d'exception de niveau supérieur n'est pas bon, puisque j'essaie de décorer l'exception avant qu'elle ne remonte la pile de propagation, et que le gestionnaire de niveau supérieur arrive trop tard.
Ce problème est en partie résolu par la dérivation de mon module foo
des types d'exception spécifiques du type existant (par ex. class FooPermissionError(OSError, FooError)
), mais cela ne facilite pas l'intégration de l'instance d'exception existante dans un nouveau type, ni la modification du message.
Python PEP 3134 "Exception Chaining and Embedded Tracebacks" traite d'un changement accepté dans Python 3.0 pour le "chaînage" des objets d'exception, afin d'indiquer qu'une nouvelle exception a été soulevée pendant le traitement d'une exception existante.
Ce que j'essaie de faire est lié : J'ai besoin que cela fonctionne aussi dans les versions antérieures de Python, et j'en ai besoin non pas pour le chaînage, mais seulement pour le polymorphisme. Quelle est la bonne façon de procéder ?