Estoy escribiendo un módulo y quiero tener una jerarquía de excepción unificada para las excepciones que puede generar (por ejemplo, heredar de una FooError
clase abstracta para todas las foo
excepciones específicas del módulo). Esto permite a los usuarios del módulo capturar esas excepciones particulares y manejarlas de manera distinta, si es necesario. Pero muchas de las excepciones generadas desde el módulo se generan debido a alguna otra excepción; por ejemplo, fallar en alguna tarea debido a un error OSEr en un archivo.
Lo que necesito es "envolver" la excepción detectada de manera que tenga un tipo y mensaje diferente , de modo que la información esté disponible más arriba en la jerarquía de propagación por lo que detecte la excepción. Pero no quiero perder el tipo existente, el mensaje y el seguimiento de la pila; Esa es toda la información útil para alguien que intenta depurar el problema. Un controlador de excepciones de nivel superior no es bueno, ya que estoy tratando de decorar la excepción antes de que suba por la pila de propagación, y el controlador de nivel superior es demasiado tarde.
Esto se resuelve en parte derivando los foo
tipos de excepción específicos de mi módulo del tipo existente (por ejemplo class FooPermissionError(OSError, FooError)
), pero eso no hace que sea más fácil envolver la instancia de excepción existente en un nuevo tipo, ni modificar el mensaje.
El PEP 3134 de Python "Encadenamiento de excepciones y seguimientos integrados" analiza un cambio aceptado en Python 3.0 para "encadenar" objetos de excepción, para indicar que se produjo una nueva excepción durante el manejo de una excepción existente.
Lo que intento hacer está relacionado: también necesito que funcione en versiones anteriores de Python, y no lo necesito para encadenar, sino solo para el polimorfismo. ¿Cuál es la forma correcta de hacer esto?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> esta solución es de otra pregunta SO . Esto no es bonito sino funcional.