J'ai ce try
bloc dans mon code:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
À proprement parler, j'en soulève un autre ValueError
, pas le ValueError
jeté par do_something...()
, qui est appelé err
dans ce cas. Comment puis-je joindre un message personnalisé à err
? J'essaie le code suivant mais échoue en raison d' err
une ValueError
instance qui ne peut pas être appelée:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
Réponses:
Mise à jour: pour Python 3, vérifiez la réponse de Ben
Pour attacher un message à l'exception actuelle et la relancer: (le try / except externe est juste pour montrer l'effet)
Pour python 2.x où x> = 6:
Cela fera également la bonne chose si
err
est dérivé deValueError
. Par exempleUnicodeDecodeError
.Notez que vous pouvez ajouter ce que vous voulez
err
. Par exempleerr.problematic_array=[1,2,3]
.Edit: @Ducan indique dans un commentaire que ce qui précède ne fonctionne pas avec python 3 car il
.message
n'est pas membre deValueError
. À la place, vous pouvez utiliser ceci (valide python 2.6 ou version ultérieure ou 3.x):Edit2:
En fonction de l'objectif, vous pouvez également opter pour l'ajout d'informations supplémentaires sous votre propre nom de variable. Pour python2 et python3:
la source
print
, vous devriez probablement noter que votre code ne fonctionne pas dans Python 3.x car il n'y a pas d'message
attribut sur les exceptions.err.args = (err.args[0] + " hello",) + err.args[1:]
peut fonctionner de manière plus fiable (et ensuite simplement convertir en une chaîne pour obtenir le message)..message
attribut fait quelque chose ici est que cet attribut est explicitement imprimé. Si vous deviez lever l'exception sans attraper et imprimer, vous ne verriez pas l'.message
attribut faire quoi que ce soit d'utile.Si vous avez la chance de ne supporter que python 3.x, cela devient vraiment une chose de beauté :)
augmenter de
Nous pouvons enchaîner les exceptions en utilisant relancer de .
Dans ce cas, l'exception que votre appelant attraperait a le numéro de ligne de l'endroit où nous levons notre exception.
Notez que l'exception du bas n'a que le stacktrace à partir duquel nous avons levé notre exception. Votre appelant peut toujours obtenir l'exception d'origine en accédant à l'
__cause__
attribut de l'exception qu'il détecte.with_traceback
Ou vous pouvez utiliser with_traceback .
En utilisant ce formulaire, l'exception que votre appelant attraperait a le traçage à partir de l'endroit où l'erreur d'origine s'est produite.
Notez que l'exception du bas a la ligne où nous avons effectué la division invalide ainsi que la ligne où nous relançons l'exception.
la source
raise Exception('Smelly socks') from e
être modifié pour ajouter simplement "Smelly socks" en tant que commentaire au retraçage d'origine plutôt que d'introduire un nouveau retraçage de son propre chef.raise RuntimeError("Something bad happened") from None
imprime:
la source
raise
sans paramètres est re-soulevé. Si OP veut ajouter un message, il doit lever une nouvelle exception et peut réutiliser le message / type de l'exception d'origine.Il semble que toutes les réponses ajoutent des informations à e.args [0], modifiant ainsi le message d'erreur existant. Y a-t-il un inconvénient à étendre le tuple args à la place? Je pense que l'avantage possible est que vous pouvez laisser le message d'erreur d'origine seul pour les cas où l'analyse de cette chaîne est nécessaire; et vous pouvez ajouter plusieurs éléments au tuple si votre gestion d'erreur personnalisée produit plusieurs messages ou codes d'erreur, pour les cas où le traçage serait analysé par programme (comme via un outil de surveillance du système).
ou
Pouvez-vous voir un inconvénient à cette approche?
la source
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 traçage d'origine. Cela demande
six
la source
six
) est EOL. Alors, c'est mauvais. Bien que techniquement on puisse encore l'utilisersix
en 2020, il n'y a pas d'avantage tangible à le faire. Les solutions Pure-Python 3.x sont désormais largement préférables.Ce modèle de code doit vous permettre de déclencher une exception avec un message personnalisé.
la source
Exception
avec un message personnalisé en Python?" Cette non-réponse soulève une nouvelle exception et ne répond donc pas du tout à la question initiale. C'est pourquoi nous ne pouvons pas avoir de bonnes choses.Soit déclencher la nouvelle exception avec votre message d'erreur en utilisant
ou
à l'endroit où vous voulez le lever OU joindre (remplacer) le message d'erreur dans l'exception actuelle en utilisant 'from' (Python 3.x pris en charge uniquement):
la source
La réponse actuelle n'a pas fonctionné correctement pour moi, si l'exception n'est pas réattrapée, le message ajouté n'est pas affiché.
Mais faire comme ci-dessous permet de conserver la trace et d'afficher le message ajouté, que l'exception soit à nouveau interceptée ou non.
(J'ai utilisé Python 2.7, je ne l'ai pas essayé en Python 3)
la source
Les exceptions intégrées Python 3 ont le
strerror
champ:la source
strerror
variable d'instance est spécifique à l'OSError
exception . Étant donné que la plupart desValueError
exceptions sont garanties de ne pas définir cette variable, cette non-solution soulève généralement des exceptions non lisibles par l'homme et est donc activement nuisible. lol, bro.Cela ne fonctionne qu'avec Python 3 . Vous pouvez modifier les arguments d'origine de l'exception et ajouter vos propres arguments.
Une exception se souvient des arguments avec lesquels elle a été créée. Je suppose que c'est pour que vous puissiez modifier l'exception.
Dans la fonction,
reraise
nous ajoutons les arguments d'origine de l'exception avec tous les nouveaux arguments que nous voulons (comme un message). Enfin, nous levons à nouveau l'exception tout en préservant l'historique de retraçage.production
la source
Aucune des solutions ci-dessus n'a fait exactement ce que je voulais, c'est-à-dire 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 fonctionné pour moi:
la source
si vous souhaitez personnaliser le type d'erreur, une chose simple que vous pouvez faire est de définir une classe d'erreur basée sur ValueError.
la source