Obtener el valor de excepción en Python

Resuelto Frias asked hace 14 años • 7 respuestas

Si tengo ese código:

try:
    some_method()
except Exception, e:

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

Frias avatar Nov 30 '10 04:11 Frias
Aceptado

usarstr

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

Además, la mayoría de las clases de excepción tendrán un argsatributo. A menudo args[0]aparecerá un mensaje de error.

Cabe señalar que simplemente usarlo strdevolverá una cadena vacía si no hay ningún mensaje de error, mientras que usarlo reprcomo recomienda pyfunc mostrará al menos 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 de cómo se crea una instancia. ¿Tenías algo en particular en mente?

aaronasterling avatar Nov 29 '2010 21:11 aaronasterling

Utilice repr() y la diferencia entre utilizar 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
pyfunc avatar Nov 29 '2010 21:11 pyfunc

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

Úselo 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.

Blckknght avatar Oct 15 '2013 22:10 Blckknght

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 entre comillas y posiblemente con el encabezado uif Unicode:

'integer division or modulo by zero'

repr(e)proporciona 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 quedado obsoleto2.6 , finalmente, definitivamente parece que todavía no existe una forma estandarizada de mostrar mensajes de excepción. Entonces, supongo que lo mejor es lidiar con sus necesidades (y posiblemente e.argssi la biblioteca que está utilizando depende de ese mecanismo).str(e)e.message

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

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

cedbeu avatar Oct 15 '2013 10:10 cedbeu