Utiliser les tracebacks pour rechercher les erreurs

Effectué

Les exceptions dans Python sont une fonctionnalité principale du langage. Vous serez peut-être surpris de lire que quelque chose qui produit des erreurs est présenté comme une fonctionnalité. Cette surprise peut être due au fait que des outils logiciels fiables ne semblent pas se bloquer avec un traceback (plusieurs lignes de texte qui indiquent comment l’erreur a commencé et comment elle s’est terminée).

Les exceptions sont cependant utiles, car elles peuvent aider dans la prise de décisions en produisant des messages d’erreur descriptifs. Elles peuvent vous aider à gérer à la fois les problèmes attendus et les problèmes inattendus.

Tracebacks

Un traceback est le corps du texte qui peut pointer vers l’origine (et la fin) d’une erreur non gérée. La compréhension des composants d’un traceback va vous permettre d’être plus efficace quand vous corrigez des erreurs ou que vous déboguez un programme qui ne fonctionne pas correctement.

La première fois que vous rencontrez des exceptions dans Python, vous pouvez être tenté d’éviter l’erreur en la supprimant. Quand un programme subit une erreur non gérée, un traceback apparaît dans la sortie. Comme vous le verrez dans ce module, les tracebacks sont utiles. Il existe plusieurs façons de gérer correctement les erreurs afin qu’elles n’apparaissent pas ou qu’elles montrent seulement des informations utiles.

Ouvrez une session interactive Python et essayez d’ouvrir un fichier inexistant :

open("/path/to/mars.jpg")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

Cette sortie comporte plusieurs parties clés. Tout d’abord, le traceback mentionne l’ordre de la sortie. Ensuite, il vous informe que le fichier est stdin (entrée dans le terminal interactif) sur la première ligne de l’entrée. L’erreur est FileNotFoundError (le nom de l’exception), ce qui signifie que le fichier n’existe pas ou éventuellement que son répertoire n’existe pas.

C’est un grand nombre d’informations. Il peut être difficile de comprendre la raison pour laquelle la ligne 1 est utile ou ce que Errno 2 signifie.

Ouvrez le répertoire souhaité dans Visual Studio Code et créez un fichier Python nommé open.py.

Screenshot showing the creation of a new Python file in Visual Studio Code.

Ajoutez le contenu suivant au fichier et enregistrez-le :

def main():
    open("/path/to/mars.jpg")

if __name__ == '__main__':
    main()

Il s’agit d’une seule fonction main() qui ouvre le fichier inexistant, exactement comme précédemment. À la fin, cette fonction utilise une assistance Python qui indique à l’interpréteur d’exécuter la fonction main() quand elle est appelée sur le terminal. Exécutez la commande dans un terminal Bash avec Python et vérifiez le message d’erreur :

python3 open.py
Traceback (most recent call last):
  File "/tmp/open.py", line 5, in <module>
    main()
  File "/tmp/open.py", line 2, in main
    open("/path/to/mars.jpg")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

La sortie de l’erreur a maintenant plus de sens. Les chemins pointent vers un fichier appelé open.py. La sortie mentionne que l’erreur commence à la ligne 5, qui comprend l’appel à main(). Ensuite, la sortie suit l’erreur à la ligne 2 dans l’appel de la fonction open(). Et enfin, FileNotFoundError signale à nouveau que le fichier ou le répertoire n’existe pas.

Les tracebacks incluent presque toujours les informations suivantes :

  • Tous les chemins de fichier impliqués, pour chaque appel à chaque fonction.
  • Les numéros de ligne associés à chaque chemin de fichier.
  • Les noms des fonctions, des méthodes ou des classes impliquées dans la production d’une exception.
  • Le nom de l’exception qui a été levée.