Obtener el valor de excepción en Python

3 minutos de lectura

avatar de usuario
Frías

Si tengo ese código:

try:
    some_method()
except Exception, e:

¿Cómo puedo obtener este valor de excepción (me refiero a la representación de cadena)?

avatar de usuario
aaronasterling

usar str

try:
    some_method()
except Exception as e:
    s = str(e)

Además, la mayoría de las clases de excepción tendrán un args atributo. Con frecuencia, args[0] será un mensaje de error.

Cabe señalar que con solo usar str devolverá una cadena vacía si no hay un mensaje de error mientras usa repr como recomienda pyfunc, al menos mostrará la clase de la excepción. Mi opinión es que si lo está imprimiendo, es para un usuario final al que no le importa cuál es la clase y solo quiere un mensaje de error.

Realmente depende de la clase de excepción con la que esté tratando y cómo se instancia. ¿Tenías algo en particular en mente?

avatar de usuario
pifunc

Use repr() y La diferencia entre usar repr y str

Usando repr:

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")

Usando str:

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined

Aunque me doy cuenta de que esta es una vieja pregunta, me gustaría sugerir el uso de la traceback módulo para manejar la salida de las excepciones.

Usar traceback.print_exc() para imprimir la excepción actual al error estándar, tal como se imprimiría si no se detectara, o traceback.format_exc() para obtener el mismo resultado que una cadena. Puede pasar varios argumentos a cualquiera de esas funciones si desea limitar la salida o redirigir la impresión a un objeto similar a un archivo.

avatar de usuario
cedbeu

Aún no se ha dado otra forma:

try:
    1/0
except Exception, e:
    print e.message

Producción:

integer division or modulo by zero

args[0] en realidad podría no ser un mensaje.

str(e) podría devolver la cadena con comillas alrededor y posiblemente con el principio u si unicode:

'integer division or modulo by zero'

repr(e) da la representación de excepción completa que probablemente no sea lo que desea:

"ZeroDivisionError('integer division or modulo by zero',)"

editar

Culpa mía !!! Parece que BaseException.message ha sido desaprobado de 2.6, finalmente, definitivamente parece que todavía no hay una forma estandarizada de mostrar mensajes de excepción. Así que supongo que lo mejor es hacer frente a e.args y str(e) dependiendo de sus necesidades (y posiblemente e.message si la lib que está utilizando depende de ese mecanismo).

Por ejemplo, con pygraphviz, e.message es la única forma de mostrar correctamente la excepción, usando str(e) rodeará el mensaje con u''.

Pero con MySQLdbla forma correcta de recuperar el mensaje es e.args[1]: e.message está vacío, y str(e) mostrará '(ERR_CODE, "ERR_MSG")'

Para inspeccionar el mensaje de error y hacer algo con él (con Python 3)…

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}

avatar de usuario
aporc

Para python2, es mejor usar e.message para obtener el mensaje de excepción, esto evitará posibles UnicodeDecodeError. Pero si e.message estará vacío para algún tipo de excepciones como OSErroren cuyo caso podemos añadir un exc_info=True a nuestra función de registro para no perder el error.
Para python3, creo que es seguro de usar str(e).

Lo siguiente funcionó para mí:

import traceback

try:
    some_method()
except Exception as e:
   # Python 3.9 or older
   print("".join(traceback.format_exception_only(type(e), e)).strip())
   # Python 3.10+
   print("".join(traceback.format_exception_only(e)).strip())

Si some_method() plantea la excepción ValueError("asdf")esto imprime lo que ve en los rastreos, menos el rastreo: ValueError: asdf.

Aquí está la documentación sobre esto.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad