2010-11-29 14 views

Respuesta

186

uso 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 atributo args. A menudo, args[0] será un mensaje de error.

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

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

+0

Estoy impresión esto para hacer un informe, el str (e) está bien, supongo. Muchas gracias –

+5

Preferiría usar 'e.message' porque' args [0] 'podría no ser realmente un mensaje. – cedbeu

+1

repr (e) también es útil si desea obtener la excepción completa (por ejemplo, NameError ("nombre global 'variable' no está definida"), en lugar de "nombre global 'variable' no está definida" –

119

Uso repr() y la diferencia entre el uso de repr y str

Usando repr:

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

Usando str:

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

¡Un gran consejo! No sabía acerca de la diferencia para las excepciones. – LavaScornedOven

+1

sugiero usar una letra diferente para la 'e' indefinida y la excepción 'e' para evitar que la gente las confunda – BoteRock

+1

ah, 'repr' es útil gracias, parece que todo lo demás' unicode', 'str', codificación , ... puede generar una excepción dependiendo de la entrada. No es muy útil al intentar mantener la excepción, pero repr es 'exception-safe', parece – dashesy

18

Otra forma no ha sido dado todavía:

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

Salida:

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 circundantes y posiblemente con el principal u si Unicode:

'integer division or modulo by zero' 

repr(e) da la representación excepción completo, que probablemente no es lo que quiere:

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

editar

My bad !!! Parece que BaseException.messagehas been deprecated from 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 manera de mostrar correctamente la excepción, utilizando str(e) rodeará el mensaje con u''.

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

17

aunque soy consciente de que esto es una vieja pregunta, me gustaría sugerir el uso de la traceback module para manejar el resultado de las excepciones.

Utilice traceback.print_exc() para imprimir la excepción actual al error estándar, tal como se imprimiría si no se detecta, 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.

0

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

0

Si no conoce el tipo/origen del error, puede intentar:

import sys 
try: 
    doSomethingWrongHere() 
except: 
    print('Error: {}'.format(sys.exc_info()[0])) 

pero tenga en cuenta, que obtendrá la advertencia PEP8:

[W] PEP 8 (E722): do not use bare except 
Cuestiones relacionadas