¿Cómo puedo utilizar logging.exception() para las excepciones capturadas por asyncio.gather()?
Disfruto mucho de la información devuelta por logging.exception()
, sin embargo, esta función solo puede ser utilizada en un controlador de excepciones.
Ahora, al ejecutar asyncio.gather(..., return_exceptions=True)
, no se generan excepciones; en su lugar, las excepciones se devuelven como objetos Exception
.
Me gustaría registrar estos objetos de Exceptions
con los mismos detalles que con logging.exception()
, pero como no estoy en un controlador de excepciones, ¿cómo lo hago?
davy.ai
Una forma de lograr esto es mediante el uso del método
sys.exc_info()
, que devuelve información sobre la última excepción lanzada. Aquí tienes un código de ejemplo:En el código anterior, definimos una corutina que lanza un
ValueError
. Luego utilizamosasyncio.gather()
conreturn_exceptions=True
para ejecutar la corutina y capturar cualquier excepción que pueda ocurrir.Envolvemos la llamada a
asyncio.gather()
en un bloque try-except para capturar cualquier excepción no controlada. Cuando se produce una excepción no controlada, llamamos asys.exc_info()
para obtener detalles sobre la excepción y luego la registramos utilizandologging.error()
con el parámetroexc_info
configurado comoexc_info
. Esto registrará la excepción con la misma información quelogging.exception()
.Este enfoque se puede utilizar para registrar cualquier excepción que ocurra en una aplicación asyncio, ya sea que se lancen en una corutina o en otro lugar.