La publicación de pzrq dice usar:
str(e)
Esto era exactamente lo que necesitaba.
(Si se encuentra en un entorno Unicode, parece que:
unicode(e)
funcionará, y parece funcionar bien en un entorno no Unicode)
Pzrq dijo muchas otras cosas buenas, pero casi me pierdo su respuesta debido a todas las cosas buenas. Como no tengo 50 puntos, no puedo comentar su respuesta para intentar llamar la atención sobre la solución simple que funciona, y como no tengo 15, no puedo votar esa respuesta, pero puedo publicar (se siente al revés, pero oh bueno), así que aquí estoy publicando, probablemente pierda puntos por eso ...
Dado que mi punto es llamar la atención sobre la respuesta de pzrq, por favor, no te deslumbres y te lo pierdas en todo lo que sigue. Las primeras líneas de esta publicación son las más importantes.
Mi historia:
El problema por el que vine aquí fue si quieres atrapar una excepción de una clase sobre la que no tienes control, ¿entonces qué? ¡Ciertamente no voy a subclasificar todas las clases posibles que usa mi código en un intento de poder obtener un mensaje de todas las posibles excepciones!
Estaba usando:
except Exception as e:
print '%s (%s)' % (e.message,type(e))
que, como todos sabemos, da la advertencia sobre la que OP preguntó (que me trajo aquí), y esto, que pzrq da como una forma de hacerlo:
except Exception as e:
print '%s (%s)' % (str(e),type(e))
No.
No estoy en un entorno Unicode, pero la respuesta de jjc me hizo preguntarme, así que tuve que intentarlo. En este contexto esto se convierte en:
except Exception as e:
print '%s (%s)' % (unicode(e),type(e))
que, para mi sorpresa, funcionó exactamente como str (e), así que ahora eso es lo que estoy usando.
No sé si 'str (e) / unicode (e)' es la 'forma aprobada de Python', y probablemente descubriré por qué eso no es bueno cuando llegue a 3.0, pero uno espera que la capacidad de manejar un excepción inesperada (*) sin morir y aún así obtener información de ella nunca desaparecerá ...
(*) Hmm. "excepción inesperada" - ¡Creo que simplemente tartamudeé!