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)

1voto

user3761308 Points 149

Les exceptions intégrées à Python 3 ont l'attribut strerror champ :

except ValueError as err:
  err.strerror = "New error message"
  raise err

1voto

RobinL Points 849

Aucune des solutions ci-dessus n'a permis de réaliser exactement ce que je voulais, à savoir ajouter des informations à la première partie du message d'erreur, c'est-à-dire que je voulais que mes utilisateurs voient d'abord mon message personnalisé.

Cela a marché pour moi :

exception_raised = False
try:
    do_something_that_might_raise_an_exception()
except ValueError as e:
    message = str(e)
    exception_raised = True

if exception_raised:
    message_to_prepend = "Custom text"
    raise ValueError(message_to_prepend + message)

-1voto

Peter Húbek Points 199

La plupart des solutions proposées dépassent le fait de lever à nouveau une exception, ce qui est considéré comme une mauvaise pratique. Une solution simple comme celle-ci fera l'affaire

try:
    import settings
except ModuleNotFoundError:
    print("Something meaningfull\n")
    raise 

Donc, vous allez d'abord imprimer le message d'erreur, puis afficher la trace de la pile, ou vous pouvez simplement sortir par sys.exit(1) et ne pas afficher le message d'erreur du tout.

-1voto

Jose Rondon Points 84

J'ai essayé cette version compacte de @RobinL, et ça a marché aussi bien :

try:
    do_something_that_might_raise_an_exception()
except ValueError as e:
    raise ValueError(f'Custom text {e}')

-7voto

igni Points 94

Si vous voulez personnaliser le type d'erreur, une chose simple que vous pouvez faire est de définir une classe d'erreur basée sur ValueError.

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