validar try tipos sirve que por pass para excepciones ejemplos diferentes archivos anidados python exception exception-handling

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'')