Estoy trabajando en una biblioteca de envío de correo, y quiero poder detectar excepciones producidas por los remitentes (SMTP, Google App Engine, etc.) y envolverlas en excepciones fácilmente identificables específicas de mi biblioteca (ConnectionError, MessageSendError, etc.), con la traza original intacta para que pueda ser depurada. ¿Cuál es la mejor manera de hacer esto en Python 2?Envolver excepciones en Python
24
A
Respuesta
24
La forma más sencilla sería volver a subir con el objeto de trazado anterior. El siguiente ejemplo muestra lo siguiente:
import sys
def a():
def b():
raise AssertionError("1")
b()
try:
a()
except AssertionError: # some specific exception you want to wrap
trace = sys.exc_info()[2]
raise Exception("error description"), None, trace
Consulte la documentación de la raise statement para los detalles de los tres parámetros. Mi ejemplo imprimiría:
Traceback (most recent call last):
File "C:\...\test.py", line 9, in <module>
a()
File "C:\...\test.py", line 6, in a
b()
File "C:\...\test.py", line 5, in b
raise AssertionError("1")
Exception: error description
Para completar, en Python 3 que tendría que utilizar el raise MyException(...) from e
syntax.
1
Esta respuesta es probablemente un poco tarde, pero puede ajustar la función en un python decorator.
Aquí hay un simple cheatsheet sobre cómo diferentes decoradores.
Aquí hay algunos ejemplos de código de cómo hacer esto. Simplemente cambie el decorator
para detectar diferentes errores de las diferentes maneras que necesita.
def decorator(wrapped_function):
def _wrapper(*args, **kwargs):
try:
# do something before the function call
result = wrapped_function(*args, **kwargs)
# do something after the function call
except TypeError:
print("TypeError")
except IndexError:
print("IndexError")
# return result
return _wrapper
@decorator
def type_error():
return 1/'a'
@decorator
def index_error():
return ['foo', 'bar'][5]
type_error()
index_error()
Cuestiones relacionadas
- 1. Cómo envolver un dict python?
- 2. Python: excepciones en las asignaciones
- 3. excepciones Python MySQLdb
- 4. Envolver una clase de C++ en Python usando SWIG
- 5. Cómo envolver una función init/cleanup en Boost python
- 6. Python: Queue.Empty manejo de excepciones
- 7. Pruebas unitarias para excepciones en el constructor Python
- 8. ¿Manera correcta de manejar excepciones en Python?
- 9. Captura de todas las excepciones en Python
- 10. Costo de manejadores de excepciones en Python
- 11. guardar Excepciones al archivo en python
- 12. Python httplib2 Manejo de excepciones
- 13. Python solicita manejo de excepciones
- 14. envolver en TextBlock
- 15. CSS envolver
- 16. Cómo envolver ItemsPanel en LongListSelector?
- 17. Cómo envolver ConcurrentDictionary en BlockingCollection?
- 18. SWIG: Informar excepciones Python del código C++
- 19. Python: Decorador de excepciones. Cómo conservar stacktrace
- 20. Python bloque try no coge os.system excepciones
- 21. Lanzar excepciones personalizadas en Java
- 22. ¿Envolver todo en bloques try/catch constituye una programación defensiva?
- 23. control de excepciones Genérico en Python la "manera correcta"
- 24. Impresión de excepciones de subproceso demoníaco en Python
- 25. Mala idea para detectar todas las excepciones en Python
- 26. ¿Existe alguna manera de manejar excepciones en Python?
- 27. Planteando excepciones cuando ya existe una excepción en Python 3
- 28. Forma idiomática de recopilar e informar múltiples excepciones en Python
- 29. iterador .NET para envolver throwing API
- 30. ¿Debo siempre envolver mi código en intentar ... atrapar bloques?
'raise Exception (" error description "), None, trace' tiene el efecto secundario de perder el mensaje de error original. Alguien sabe una forma de evitar esto? –
Terminé usando el mensaje de la excepción original y lo concateno en el nuevo mensaje. –
Lo hago así: 'raise Exception (" descripción de error \ nCaused by: {}: {} ". Format (tipo (e) .__ name__, str (e))), None, sys.exc_info() [2 ] ' –