tipos - try except anidados python
Cómo obtener un mensaje de excepción en Python correctamente (3)
Para mejorar la respuesta proporcionada por
, esto es lo que considero una forma más
de verificar el atributo del
message
e imprimirlo o imprimir el objeto
Exception
como reserva.
try:
pass
except Exception as e:
print getattr(e, ''message'', repr(e))
La llamada a
repr
es opcional, pero me parece necesaria en algunos casos de uso.
Actualización n. ° 1:
Después del comentario de
@MadPhysicist
, aquí hay una prueba de por qué la llamada a
repr
puede ser necesaria.
Intente ejecutar el siguiente código en su intérprete:
try:
raise Exception
except Exception as e:
print(getattr(e, ''message'', repr(e)))
print(getattr(e, ''message'', str(e)))
Actualización n. ° 2:
Aquí hay una demostración con detalles para Python 2.7 y 3.5: https://gist.github.com/takwas/3b7a6edddef783f2abddffda1439f533
¿Cuál es la mejor manera de obtener mensajes de excepciones de los componentes de la biblioteca estándar en Python?
Noté que en algunos casos puede obtenerlo a través de un campo de
message
como este:
try:
pass
except Exception as ex:
print(ex.message)
pero en algunos casos (por ejemplo, en caso de errores de socket) debe hacer algo como esto:
try:
pass
except socket.error as ex:
print(ex)
Me preguntaba si hay alguna forma estándar de cubrir la mayoría de estas situaciones.
Si observa la
documentación de los errores integrados
, verá que la mayoría de las clases de
Exception
asignan su primer argumento como un atributo de
message
.
Sin embargo, no todos lo hacen.
En particular,
EnvironmentError
(con las subclases
IOError
y
OSError
) tiene un primer argumento de
errno
, el segundo de
strerror
.
No hay
message
...
strerror
es más o menos análogo a lo que normalmente sería un
message
.
De manera más general, las subclases de
Exception
pueden hacer lo que quieran.
Pueden o no tener un atributo de
message
.
Las futuras
Exception
incorporadas pueden no tener un atributo de
message
.
Cualquier subclase de
Exception
importada de bibliotecas de terceros o código de usuario puede no tener un atributo de
message
.
Creo que la forma correcta de manejar esto es identificar las subclases de
Exception
específicas que desea capturar, y luego capturar solo aquellas en lugar de todo con una
except Exception
, y luego utilizar los atributos que esa subclase específica defina como desee.
Si debe
print
algo, creo que es más probable que imprimir la
Exception
capturada haga lo que quiera, ya sea que tenga un atributo de
message
o no.
También podría verificar el atributo del mensaje si lo desea, de esta manera, pero realmente no lo sugeriría, ya que parece desordenado:
try:
pass
except Exception as e:
# Just print(e) is cleaner and more likely what you want,
# but if you insist on printing message specifically whenever possible...
if hasattr(e, ''message''):
print(e.message)
else:
print(e)
Yo tuve el mismo problema. Creo que la mejor solución es usar log.exception, que imprimirá automáticamente el seguimiento de la pila y el mensaje de error, como:
try:
pass
log.info(Success'')
except:
log.exception(''Failed'')