HOWTO · Python
Comment afficher une exception en Python
Découvrez comment afficher une exception en Python, choisir entre un message et une trace complète, et éviter les erreurs courantes.
Sur cette page
Utilisez print(exception) si vous avez seulement besoin du message d’erreur. Utilisez traceback.print_exc() dans un bloc except actif si vous avez besoin de la trace complète, avec le fichier et la ligne à l’origine de l’erreur. Gérez les types d’exception précis et préférez logging à print() pour les diagnostics à conserver.
Afficher le message de l’exception
Capturez l’exception dans une variable et transmettez-la à print(). C’est la façon la plus courte de voir ce qui s’est passé :
try:
result = 10 / 0
except ZeroDivisionError as exc:
print("Could not calculate result:", exc)
Sortie :
Could not calculate result: division by zero
L’objet exception est converti en texte de message. Cet exemple intercepte précisément ZeroDivisionError, ce qui réduit le risque de masquer une erreur de programmation sans rapport. Si plusieurs erreurs doivent être traitées de la même façon, placez leurs types dans un tuple, par exemple except (TypeError, ValueError) as exc:.
Afficher la trace complète
Le message n’indique pas toujours l’origine de l’erreur. Importez le module intégré traceback de Python et appelez print_exc() pendant que le gestionnaire est actif :
import traceback
try:
values = [1, 2]
value = values[3]
except IndexError:
traceback.print_exc()
La sortie contient le type d’exception, le message, le fichier et la ligne qui a échoué. Une trace est plus utile qu’un message lorsque l’exception provient de plusieurs appels de fonctions imbriqués.
print_exc() lit l’exception actuellement traitée. L’appeler après la fin du bloc except, ou sans exception active, ne récupère pas une ancienne trace ; la fonction peut afficher NoneType: None. Gardez l’appel dans le gestionnaire ou conservez l’exception et utilisez print_exception() pour un contrôle explicite.
Contrôler explicitement le format de la trace
traceback.print_exception() accepte un objet exception et peut écrire dans un flux choisi. C’est utile lorsque l’exception doit être formatée ou redirigée :
import sys
import traceback
try:
int("not a number")
except ValueError as exc:
traceback.print_exception(exc, file=sys.stdout)
Pour créer du texte au lieu de l’imprimer immédiatement, utilisez traceback.format_exception(exc) :
import traceback
try:
raise RuntimeError("configuration is missing")
except RuntimeError as exc:
formatted = "".join(traceback.format_exception(exc))
print(formatted)
Les fonctions traceback conservent par défaut le chaînage des exceptions. Une chaîne raise ... from ... peut donc montrer l’exception d’origine et la nouvelle. Limitez la trace ou désactivez le chaînage uniquement si le contrat de sortie l’exige ; supprimer le contexte complique le diagnostic.
Exceptions personnalisées et journalisation
Définissez une exception personnalisée lorsque les appelants doivent distinguer une erreur métier d’une erreur intégrée. Interceptez ce type et affichez son message de la même manière :
class ConfigurationError(Exception):
pass
try:
raise ConfigurationError("API key is missing")
except ConfigurationError as exc:
print("Configuration failed:", exc)
Dans une application ou un service, préférez logging.exception() dans le gestionnaire. Il enregistre le message et la trace active, et les gestionnaires de journalisation peuvent les envoyer dans un fichier ou vers la supervision :
import logging
try:
load_settings()
except Exception:
logging.exception("Loading settings failed")
Remplacez load_settings() par l’opération susceptible d’échouer. L’exemple utilise volontairement une capture large de Exception à une limite de journalisation ; la logique courante doit intercepter les types précis qu’elle sait réellement traiter.
Erreurs courantes et FAQ
- Un
except:nu intercepte aussiKeyboardInterruptetSystemExit. Évitez-le sauf raison précise de gérer des sous-classes deBaseException. - N’affichez pas seulement un message générique avant de continuer silencieusement si le programme ne peut pas produire un résultat valide. Relancez l’exception ou renvoyez un échec explicite.
type(exc)affiche la classe concrète,str(exc)le message lisible etrepr(exc)peut fournir une représentation plus utile au diagnostic.- Si la sortie est destinée à un journal, utilisez
logging.exception()dans le gestionnaire. Pour un court diagnostic interactif,print(exc)suffit. traceback.print_exc()concerne l’exception en cours de traitement ;traceback.print_exception(exc)est plus clair lorsque vous conservez l’objet et devez contrôler le format ou la sortie.
Ces modèles utilisent le mécanisme d’exception intégré de Python et ne nécessitent aucun paquet tiers. Le bon choix dépend du besoin : message, chemin complet des appels, texte formaté ou journalisation durable de l’application.