Si tengo ese código:
try:
some_method()
except Exception, e:
¿Cómo puedo obtener este valor de excepción (quiero decir, representación de cadena)?
utilizar 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 argsatributo. A menudo, args[0]habrá un mensaje de error.
Cabe señalar que solo usando strdevolverá una cadena vacía si no hay un mensaje de error mientras usarepr como lo 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 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é lidiando y cómo se instancia. ¿Tenías algo en particular en mente?
e.messageporqueargs[0]podría no ser realmente un mensaje.raise Exception(u'jörn'). El fallo es especialmente malo, porque nunca verá la excepción real sino solo unaUnicodeDecodeError. Si no conoce la codificación de la excepción (y la mayoría de las veces no lo sabe), debe trabajarrepr(e)o, si realmente lo necesita, usar otro bloque try-except en su manejo de excepciones que detecta UnicodeDecodeErrors y vuelve arepr(e).str(o inclusounicodeo.format) ha causado errores debido al manejo de Unicode. Si no tiene el control completo del contenido del mensaje de error, SIEMPRE usereprpara evitar errores inesperados de Unicode.Utilizando
repr:Utilizando
str:fuente
repres útil gracias, parece otra cosaunicode,strque codifica, ... pueden provocar una excepción dependiendo de la entrada. No es muy útil cuando se trata de mantener la excepción a la mirada, pero repr esexception-safeque parecestr()solución similar, porque en realidad incluye el tipo de excepción. Constr()tengo'status'mientrasrepr()que tengoKeyError('status')y dije "aaaaah, ahora entiendo el error".Aunque me doy cuenta de que esta es una vieja pregunta, me gustaría sugerir que use el
tracebackmódulo para manejar la salida de las excepciones.Utilícelo
traceback.print_exc()para imprimir la excepción actual al error estándar, tal como se imprimiría si no se detectara, otraceback.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.fuente
Todavía no se ha dado otra forma:
Salida:
args[0]en realidad podría no ser un mensaje.str(e)podría devolver la cadena con comillas circundantes y posiblemente con el iniciousi unicode:repr(e)da la representación de excepción completa que probablemente no sea lo que quieres:editar
Culpa mía !!! Parece que
BaseException.messageha quedado en desuso2.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 tratare.argsystr(e)dependiendo de sus necesidades (y posiblementee.messagesi la biblioteca que está utilizando depende de ese mecanismo).Por ejemplo, con
pygraphviz,e.messagees la única forma de mostrar correctamente la excepción, usandostr(e)rodeará el mensaje conu''.Pero con
MySQLdb, la forma correcta de recuperar el mensaje ese.args[1]:e.messageestá vacío ystr(e)mostrará'(ERR_CODE, "ERR_MSG")'fuente
Para python2, es mejor usarlo
e.messagepara obtener el mensaje de excepción, esto evitará que sea posibleUnicodeDecodeError. Pero síe.messageestará vacío para algún tipo de excepciones comoOSError, en cuyo caso podemos agregar unexc_info=Truea nuestra función de registro para no perder el error.Para python3, creo que es seguro de usar
str(e).fuente
Si no conoce el tipo / origen del error, puede intentar:
Pero tenga en cuenta que recibirá una advertencia pep8:
fuente
Para inspeccionar el mensaje de error y hacer algo con él (con Python 3) ...
fuente