Tengo este try
bloque en mi código:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
Hablando estrictamente, en realidad estoy planteando otro ValueError
, no el ValueError
arrojado do_something...()
, que se conoce como err
en este caso. ¿Cómo adjunto un mensaje personalizado err
? Intento con el siguiente código pero falla debido a que err
, por ValueError
ejemplo , no se puede llamar:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
Respuestas:
Actualización: para Python 3, verifique la respuesta de Ben
Para adjuntar un mensaje a la excepción actual y volver a subirlo: (el intento externo / excepto es solo para mostrar el efecto)
Para python 2.x donde x> = 6:
Esto también hará lo correcto si
err
se deriva deValueError
. Por ejemploUnicodeDecodeError
.Tenga en cuenta que puede agregar lo que quiera
err
. Por ejemploerr.problematic_array=[1,2,3]
.Editar: @Ducan señala en un comentario que lo anterior no funciona con python 3 ya
.message
que no es miembro deValueError
. En cambio, podría usar esto (python válido 2.6 o posterior o 3.x):Edit2:
Dependiendo de cuál sea el propósito, también puede optar por agregar la información adicional bajo su propio nombre de variable. Para python2 y python3:
fuente
print
, probablemente debería tener en cuenta que su código no funciona en Python 3.x ya que no haymessage
atributos en las excepciones.err.args = (err.args[0] + " hello",) + err.args[1:]
puede funcionar de manera más confiable (y luego simplemente convertir a una cadena para obtener el mensaje)..message
atributo hace algo aquí es que este atributo se imprime explícitamente . Si fuera a plantear la excepción sin capturar e imprimir, no vería que el.message
atributo hace nada útil.Si tienes la suerte de admitir solo Python 3.x, esto realmente se convierte en algo bello :)
elevar desde
Podemos encadenar las excepciones usando raise from .
En este caso, la excepción que detectaría su interlocutor tiene el número de línea del lugar donde planteamos nuestra excepción.
Observe que la excepción inferior solo tiene el stacktrace desde donde generamos nuestra excepción. La persona que llama aún puede obtener la excepción original accediendo al
__cause__
atributo de la excepción que detecta.con_traceback
O puede usar with_traceback .
Al usar este formulario, la excepción que su interlocutor detectaría tiene el rastreo desde donde ocurrió el error original.
Observe que la excepción inferior tiene la línea donde realizamos la división no válida, así como la línea donde volvemos a plantear la excepción.
fuente
raise Exception('Smelly socks') from e
puede modificar para agregar simplemente "calcetines malolientes" como un comentario al rastreo original en lugar de introducir un nuevo rastreo propio.raise RuntimeError("Something bad happened") from None
huellas dactilares:
fuente
raise
sin parámetros está volviendo a subir. Si OP desea agregar un mensaje, tiene que generar una nueva excepción y puede reutilizar el mensaje / tipo de la excepción original.Parece que todas las respuestas están agregando información a e.args [0], alterando así el mensaje de error existente. ¿Hay alguna desventaja en extender la tupla args en su lugar? Creo que la posible ventaja es que puede dejar solo el mensaje de error original para los casos en que se necesita analizar esa cadena; y podría agregar varios elementos a la tupla si su manejo de errores personalizado produjera varios mensajes o códigos de error, en los casos en que el rastreo se analizaría mediante programación (como a través de una herramienta de monitoreo del sistema).
o
¿Puedes ver una desventaja de este enfoque?
fuente
Esta plantilla de código debería permitirle generar una excepción con un mensaje personalizado.
fuente
Levante la nueva excepción con su mensaje de error usando
o
dentro del lugar donde desea elevarlo O adjuntar (reemplazar) el mensaje de error a la excepción actual usando 'from' (solo se admite Python 3.x):
fuente
Esta es la función que uso para modificar el mensaje de excepción en Python 2.7 y 3.x mientras se conserva el rastreo original. Requiere
six
fuente
Las excepciones incorporadas en Python 3 tienen el
strerror
campo:fuente
La respuesta actual no funcionó bien para mí, si la excepción no se vuelve a capturar, el mensaje adjunto no se muestra.
Pero al hacer lo siguiente, ambos mantienen la traza y muestran el mensaje adjunto, independientemente de si la excepción se vuelve a capturar o no.
(Usé Python 2.7, no lo he probado en Python 3)
fuente
Ninguna de las soluciones anteriores hizo exactamente lo que quería, que era agregar información a la primera parte del mensaje de error, es decir, quería que mis usuarios vieran primero mi mensaje personalizado.
Esto funcionó para mí:
fuente
Esto solo funciona con Python 3 . Puede modificar los argumentos originales de la excepción y agregar sus propios argumentos.
Una excepción recuerda los argumentos con los que se creó. Supongo que esto es para que pueda modificar la excepción.
En la función
reraise
, anteponemos los argumentos originales de la excepción con cualquier argumento nuevo que queramos (como un mensaje). Finalmente, volvemos a plantear la excepción mientras conservamos el historial de rastreo.salida
fuente
Si desea personalizar el tipo de error, una cosa simple que puede hacer es definir una clase de error basada en ValueError.
fuente