301 votes

Comment puis-je faire apparaître la même exception avec un message personnalisé en Python ?

J'ai ceci try dans mon code :

try:
    do_something_that_might_raise_an_exception()
except ValueError as err:
    errmsg = 'My custom error message.'
    raise ValueError(errmsg)

A proprement parler, je soulève en fait un autre ValueError et non le ValueError jeté par do_something...() que l'on appelle err dans ce cas. Comment joindre un message personnalisé à err ? J'ai essayé le code suivant mais il échoue en raison de err , a ValueError instance ne pouvant être appelé :

try:
    do_something_that_might_raise_an_exception()
except ValueError as err:
    errmsg = 'My custom error message.'
    raise err(errmsg)

7voto

eumiro Points 56644
try:
    try:
        int('a')
    except ValueError as e:
        raise ValueError('There is a problem: {0}'.format(e))
except ValueError as err:
    print err

des empreintes :

There is a problem: invalid literal for int() with base 10: 'a'

4voto

Azrathud Points 73

C'est la fonction que j'utilise pour modifier le message d'exception dans Python 2.7 et 3.x tout en préservant le traceback original. Elle nécessite six

def reraise_modify(caught_exc, append_msg, prepend=False):
    """Append message to exception while preserving attributes.

    Preserves exception class, and exception traceback.

    Note:
        This function needs to be called inside an except because
        `sys.exc_info()` requires the exception context.

    Args:
        caught_exc(Exception): The caught exception object
        append_msg(str): The message to append to the caught exception
        prepend(bool): If True prepend the message to args instead of appending

    Returns:
        None

    Side Effects:
        Re-raises the exception with the preserved data / trace but
        modified message
    """
    ExceptClass = type(caught_exc)
    # Keep old traceback
    traceback = sys.exc_info()[2]
    if not caught_exc.args:
        # If no args, create our own tuple
        arg_list = [append_msg]
    else:
        # Take the last arg
        # If it is a string
        # append your message.
        # Otherwise append it to the
        # arg list(Not as pretty)
        arg_list = list(caught_exc.args[:-1])
        last_arg = caught_exc.args[-1]
        if isinstance(last_arg, str):
            if prepend:
                arg_list.append(append_msg + last_arg)
            else:
                arg_list.append(last_arg + append_msg)
        else:
            arg_list += [last_arg, append_msg]
    caught_exc.args = tuple(arg_list)
    six.reraise(ExceptClass,
                caught_exc,
                traceback)

2voto

Alexey Antonenko Points 982

Soit vous levez la nouvelle exception avec votre message d'erreur en utilisant

raise Exception('your error message')

ou

raise ValueError('your error message')

à l'endroit où vous voulez le soulever OU attachez (remplacez) le message d'erreur dans l'exception actuelle en utilisant 'from' (Python 3.x supporté seulement) :

except ValueError as e:
  raise ValueError('your message') from e

2voto

hnsanadhya Points 23

Essayez ci-dessous :

try:
    raise ValueError("Original message. ")
except Exception as err:
    message = 'My custom error message. '
    # Change the order below to "(message + str(err),)" if custom message is needed first. 
    err.args = (str(err) + message,)
    raise 

Sortie :

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
      1 try:
----> 2     raise ValueError("Original message")
      3 except Exception as err:
      4     message = 'My custom error message.'
      5     err.args = (str(err) + ". " + message,)

ValueError: Original message. My custom error message.

1voto

Zitrax Points 3443

La réponse actuelle n'a pas bien fonctionné pour moi, si l'exception n'est pas rattrapée, le message ajouté n'est pas affiché.

Mais en procédant comme ci-dessous, on conserve la trace et on affiche le message ajouté, que l'exception soit rattrapée ou non.

try:
  raise ValueError("Original message")
except ValueError as err:
  t, v, tb = sys.exc_info()
  raise t, ValueError(err.message + " Appended Info"), tb

(J'ai utilisé Python 2.7, je n'ai pas essayé avec Python 3).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X