{"id":46504,"date":"2025-05-07T06:29:22","date_gmt":"2025-05-07T06:29:22","guid":{"rendered":"https:\/\/www.carmatec.com\/?p=46504"},"modified":"2025-12-31T07:39:38","modified_gmt":"2025-12-31T07:39:38","slug":"comment-imprimer-et-deboguer-les-exceptions-en-python-comme-un-pro","status":"publish","type":"post","link":"https:\/\/www.carmatec.com\/fr_fr\/blog\/how-to-print-and-debug-exceptions-in-python-like-a-pro\/","title":{"rendered":"Comment imprimer et d\u00e9boguer les exceptions en Python comme un pro"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"46504\" class=\"elementor elementor-46504\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf469a3 e-flex e-con-boxed e-con e-parent\" data-id=\"cf469a3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6c8ef79 elementor-widget elementor-widget-text-editor\" data-id=\"6c8ef79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Python est r\u00e9put\u00e9 pour sa simplicit\u00e9 et sa lisibilit\u00e9, mais m\u00eame le code le plus \u00e9l\u00e9gant peut rencontrer des erreurs. Lorsque les choses tournent mal, les exceptions sont le moyen pour Python de signaler que quelque chose d'inattendu s'est produit. Savoir imprimer et g\u00e9rer ces exceptions est une comp\u00e9tence essentielle pour tout d\u00e9veloppeur, qu'il s'agisse d'un simple script ou d'une application complexe. Dans ce guide approfondi, nous allons explorer l'art de l'impression des exceptions en Python, en nous plongeant dans des techniques pratiques, des meilleures pratiques et des exemples du monde r\u00e9el pour vous aider \u00e0 d\u00e9boguer efficacement et \u00e0 \u00e9crire un code robuste.<\/p><p>Cet article aborde les principes fondamentaux des exceptions, les diff\u00e9rentes m\u00e9thodes pour les imprimer, les techniques de d\u00e9bogage avanc\u00e9es et un exemple de codage pratique. \u00c0 la fin de l'article, vous serez \u00e9quip\u00e9 pour g\u00e9rer les erreurs avec confiance et pr\u00e9cision.<\/p><h3><strong>Que sont les exceptions en Python ?<\/strong><\/h3><p>Avant de nous plonger dans l'impression des exceptions, clarifions ce qu'est une exception. En Python, une exception est un \u00e9v\u00e9nement qui perturbe le d\u00e9roulement normal de l'ex\u00e9cution d'un programme. C'est la fa\u00e7on dont Python dit \"H\u00e9, quelque chose ne va pas ici !\". Les exceptions peuvent se produire pour diverses raisons, telles que :<\/p><ul><li><strong>FileNotFoundError :<\/strong> Tentative d'ouverture d'un fichier inexistant.<\/li><li><strong>ZeroDivisionError :<\/strong> Division d'un nombre par z\u00e9ro.<\/li><li><strong>TypeError :<\/strong> Ex\u00e9cution d'une op\u00e9ration sur des types de donn\u00e9es incompatibles.<\/li><li><strong>Erreur de cl\u00e9 :<\/strong> Acc\u00e8s \u00e0 une cl\u00e9 de dictionnaire inexistante.<\/li><\/ul><p>Lorsqu'une exception se produit, Python la l\u00e8ve et, si elle n'est pas g\u00e9r\u00e9e, le programme se bloque avec une traceback, c'est-\u00e0-dire un rapport d\u00e9taill\u00e9 de l'erreur. L'impression des exceptions vous permet de capturer et d'analyser ces erreurs, ce qui facilite le d\u00e9bogage.<\/p><h3><strong>Pourquoi imprimer des exceptions ?<\/strong><\/h3><p>L'impression des exceptions a plusieurs objectifs :<\/p><ul><li><strong>D\u00e9bogage :<\/strong> Il permet d'identifier la cause et l'emplacement d'une erreur.<\/li><li><strong>Enregistrement :<\/strong> Il enregistre les erreurs pour une analyse ult\u00e9rieure, ce qui est crucial pour les applications de production.<\/li><li><strong>Commentaires des utilisateurs :<\/strong> Il fournit des messages d'erreur significatifs aux utilisateurs.<\/li><li><strong>Am\u00e9lioration du code :<\/strong> Comprendre les exceptions permet d'\u00e9crire un code plus robuste.<\/li><\/ul><p>Explorons maintenant les diff\u00e9rentes mani\u00e8res d'imprimer les exceptions en Python.<\/p><h5><strong>M\u00e9thode 1 : Utilisation d'un bloc Essai-Exception de base<\/strong><\/h5><p>La fa\u00e7on la plus simple d'imprimer une exception est d'utiliser une fonction <code>try-except<\/code> bloc. Cette structure vous permet d'attraper les exceptions et d'imprimer leurs d\u00e9tails.<\/p><pre>python\ntry :\n    result = 10 \/ 0\nexcept ZeroDivisionError as e :\n    print(f \"Une erreur s'est produite : {e}\")<\/pre><p><strong>Sortie :<br \/><\/strong>Une erreur s'est produite : division par z\u00e9ro<\/p><p>Dans cet exemple :<\/p><ul><li>Le <code>essayer<\/code> contient du code susceptible de soulever une exception.<\/li><li>Le <code>sauf<\/code> attrape le bloc <code>Erreur de division par z\u00e9ro<\/code> et la stocke dans la variable <code>e<\/code>.<\/li><li>Le <code>imprimer<\/code> affiche le message d'exception.<\/li><\/ul><p>L'as <code>e<\/code> La syntaxe attribue l'objet d'exception \u00e0 <code>e<\/code>qui contient le message d'erreur. Vous pouvez remplacer <code>Erreur de division par z\u00e9ro<\/code> avec d'autres types d'exceptions ou utiliser un <code>Exception<\/code> pour attraper toutes les exceptions (bien que cela ne soit pas toujours recommand\u00e9).<\/p><h5><strong>M\u00e9thode 2 : Impression du Traceback complet<\/strong><\/h5><p>Parfois, vous avez besoin de plus que le message d'erreur - vous avez besoin de la traceback compl\u00e8te pour savoir o\u00f9 l'erreur s'est produite. La fonction <code>traceback<\/code> est parfait pour cela.<\/p><pre>python\nimport traceback\n\ntry :\n    result = 10 \/ 0\nexcept ZeroDivisionError :\n    traceback.print_exc()<\/pre><p><strong>Sortie :<\/strong><br \/>Traceback (dernier appel le plus r\u00e9cent) :<br \/>Fichier \"script.py\", ligne 4, dans<br \/>r\u00e9sultat = 10 \/ 0<br \/>ZeroDivisionError : division par z\u00e9ro<\/p><p>Le <code>traceback.print_exc()<\/code> affiche la trace compl\u00e8te de la pile, indiquant le fichier, le num\u00e9ro de ligne et la pile d'appels \u00e0 l'origine de l'erreur. Cette fonction est tr\u00e8s utile pour le d\u00e9bogage d'applications complexes.<\/p><h3><strong>M\u00e9thode 3 : Saisir le type d'exception et les d\u00e9tails<\/strong><\/h3><p>Pour mieux contr\u00f4ler la situation, vous pouvez capturer le type d'exception, le message et la traceback \u00e0 l'aide de la fonction <code>sys.exc_info()<\/code> de la <code>sys<\/code> module.<\/p><pre>python\nimport sys\n\ntry :\n    result = 10 \/ 0\nexcept :\n    exc_type, exc_value, exc_traceback = sys.exc_info()\n    print(f \"Type d'exception : {exc_type}\")\n    print(f \"Message d'exception : {exc_valeur}\")\n    print(f \"Traceback : {exc_traceback}\")<\/pre><p>Sortie :<br \/>Type d'exception :<br \/>Message d'exception : division par z\u00e9ro<br \/>Traceback :<\/p><p>Cette m\u00e9thode fournit des informations d\u00e9taill\u00e9es sur l'exception, utiles pour la journalisation ou la gestion personnalis\u00e9e des erreurs. Notez que la m\u00e9thode <code>sys.exc_info()<\/code> renvoie un tuple contenant le type d'exception, la valeur et l'objet de traceback.<\/p><h5><strong>M\u00e9thode 4 : Utilisation <code>try-except<\/code> avec <code>autre<\/code> et <code>enfin<\/code><\/strong><\/h5><p>Python <code>try-except<\/code> prend en charge des clauses suppl\u00e9mentaires : <code>autre<\/code> et <code>enfin<\/code>. Ceux-ci peuvent am\u00e9liorer votre gestion des exceptions.<\/p><pre>python\ntry :\n    number = int(input(\"Enter a number : \"))\nexcept ValueError as e :\n    print(f \"Entr\u00e9e invalide : {e}\")\nelse :\n    print(f \"Vous avez saisi : {num\u00e9ro}\")\nfinally :\n    print(\"Ex\u00e9cution termin\u00e9e.\")<\/pre><p><strong>Exemple de sortie (entr\u00e9e invalide) :<\/strong><br \/>Entrez un nombre : abc<br \/>Entr\u00e9e invalide : litt\u00e9ral invalide pour int() avec base 10 : 'abc'<br \/>Ex\u00e9cution termin\u00e9e.<\/p><p><strong>Exemple de sortie (entr\u00e9e valide) :<\/strong><br \/>Entrez un nombre : 42<br \/>Vous avez saisi : 42<br \/>Ex\u00e9cution termin\u00e9e.<\/p><ul><li>Le <code>autre<\/code> s'ex\u00e9cute si aucune exception ne se produit, ce qui permet de s\u00e9parer la logique de r\u00e9ussite de la gestion des erreurs.<\/li><li>Le <code>enfin<\/code> s'ex\u00e9cute ind\u00e9pendamment de l'apparition d'une exception, ce qui est id\u00e9al pour les t\u00e2ches de nettoyage telles que la fermeture de fichiers ou la lib\u00e9ration de ressources.<\/li><\/ul><h5><strong>M\u00e9thode 5 : Enregistrer les exceptions pour la production<\/strong><\/h5><p>Dans les applications de production, il ne suffit pas d'imprimer les exceptions sur la console, il faut les enregistrer pour les analyser ult\u00e9rieurement. La fonction <code>exploitation foresti\u00e8re<\/code> est parfait pour cela.<\/p><pre>python\nimport logging\n\nlogging.basicConfig(filename='app.log', level=logging.ERROR)\n\ntry :\n    result = 10 \/ 0\nexcept ZeroDivisionError as e :\n    logging.error(\"Une erreur s'est produite\", exc_info=True)<\/pre><p>Ce code enregistre l'exception, y compris la traceback compl\u00e8te, dans un fichier nomm\u00e9 <code>app.log<\/code>. Les <code>exc_info=True<\/code> permet de s'assurer que la traceback est incluse. Vous pouvez \u00e9galement configurer la journalisation de mani\u00e8re \u00e0 ce que les erreurs soient envoy\u00e9es \u00e0 un serveur ou envoy\u00e9es par courrier \u00e9lectronique aux d\u00e9veloppeurs.<\/p><h3><strong>Bonnes pratiques pour l'impression des exceptions<\/strong><\/h3><p>Pour imprimer efficacement les exceptions, suivez ces bonnes pratiques :<\/p><ul><li><strong>Soyez pr\u00e9cis en ce qui concerne les exceptions :<\/strong> Rattraper les exceptions sp\u00e9cifiques (par ex, <code>Erreur de division par z\u00e9ro<\/code>) au lieu d'un <code>Exception<\/code> pour \u00e9viter de masquer des erreurs inattendues.<\/li><li><strong>Inclure le contexte :<\/strong> Fournir des messages significatifs pour aider \u00e0 diagnostiquer le probl\u00e8me (par exemple, \"N'a pas r\u00e9ussi \u00e0 diviser 10 par 0\").<\/li><li><strong>Utiliser la journalisation dans la production :<\/strong> \u00c9viter <code>imprimer<\/code> dans le code de production ; utilisez les instructions <code>exploitation foresti\u00e8re<\/code> \u00e0 la place.<\/li><li><strong>\u00c9viter les excepts nus :<\/strong> Utilisation <code>sauf :<\/code> sans sp\u00e9cifier de type d'exception peut attraper des signaux syst\u00e8me tels que <code>Interruption du clavier<\/code>ce qui entra\u00eene des probl\u00e8mes difficiles \u00e0 d\u00e9boguer.<\/li><li><strong>Ressources pour le nettoyage :<\/strong> Utilisation <code>enfin<\/code> ou des gestionnaires de contexte (<code>avec<\/code> ) pour s'assurer que les ressources telles que les fichiers ou les connexions aux bases de donn\u00e9es sont correctement ferm\u00e9es.<\/li><\/ul><h3><strong>Exemple de codage dans le monde r\u00e9el : Un script de traitement de fichier<\/strong><\/h3><p>Let\u2019s put everything together with a practical example\u2014exactly the kind of exercise you\u2019d complete in a <a href=\"https:\/\/www.mygreatlearning.com\/academy\/premium\/master-python-programming\">python programming course<\/a>. Below is a script that processes a file, handles exceptions, and logs errors. This example demonstrates multiple exception-handling techniques.<\/p><pre>python\nimport logging\nimport traceback\nimport sys\n\n# Configurer la journalisation\nlogging.basicConfig(\n    filename='file_processor.log',\n    level=logging.ERROR,\n    format='%(asctime)s - %(levelname)s - %(message)s'\n)\n\ndef process_file(filename) :\n    \"\"\"\n    Traite un fichier et calcule la somme des nombres qu'il contient.\n    Chaque ligne doit contenir un nombre.\n    \"\"\"\n    total = 0\n    nombre_de_lignes = 0\n\n    try :\n        with open(filename, 'r') as file :\n            for line in file :\n                nombre_de_lignes += 1\n                try :\n                    number = float(line.strip())\n                    total += nombre\n                except ValueError as e :\n                    print(f \"Nombre invalide \u00e0 la ligne {num\u00e9ro_de_ligne} : {ligne.strip()}\")\n                    logging.error(f \"Erreur de valeur \u00e0 la ligne {num\u00e9ro_de_ligne} : {e}\")\n                    continue\n        else :\n            print(f \"Fichier trait\u00e9 avec succ\u00e8s. Total : {total}\")\n    except FileNotFoundError as e :\n        print(f \"Erreur : Fichier '{nom_de_fichier}' introuvable.\")\n        logging.error(f \"FileNotFoundError : {e}\", exc_info=True)\n    except PermissionError as e :\n        print(f \"Erreur : Permission refus\u00e9e pour le fichier '{nom de fichier}'.\")\n        logging.error(f \"PermissionError : {e}\", exc_info=True)\n    except Exception as e :\n        print(f \"Une erreur inattendue s'est produite : {e}\")\n        exc_type, exc_value, exc_traceback = sys.exc_info()\n        logging.error(\n            f \"Erreur inattendue : {exc_type} - {exc_valeur}\",\n            exc_info=True\n        )\n    finally :\n        print(\"Tentative de traitement de fichier termin\u00e9e.\")\n\n# Test de la fonction\nsi __name__ == \"__main__\" :\n    fichier_test = \"nombres.txt\"\n    print(f \"Tentative de traitement du fichier : {fichier_test}\")\n    process_file(fichier_test)<\/pre><h3><strong>Comment cela fonctionne-t-il ?<\/strong><\/h3><ul><li><strong>Configuration de l'enregistrement :<\/strong> Le script configure le <code>exploitation foresti\u00e8re<\/code> pour \u00e9crire les erreurs dans le module <code>file_processor.log<\/code> avec des horodatages.<\/li><li><strong>Try-Except imbriqu\u00e9 :<\/strong> L'ext\u00e9rieur <code>essayer<\/code> g\u00e8re les erreurs li\u00e9es aux fichiers (<code>Erreur de fichier non trouv\u00e9, erreur de permission<\/code>), tandis que la partie int\u00e9rieure de la <code>essayer<\/code> Le bloc g\u00e8re les nombres non valides (<code>Erreur de valeur<\/code>).<\/li><li><strong>Gestionnaire de contexte :<\/strong> Le <code>avec<\/code> garantit que le fichier est correctement ferm\u00e9, m\u00eame en cas d'erreur.<\/li><li><strong>Else Clause :<\/strong> Si le fichier est trait\u00e9 sans erreur, le total est imprim\u00e9.<\/li><li><strong>Clause finale :<\/strong> Un message est imprim\u00e9 pour indiquer que le processus est termin\u00e9.<\/li><li><strong>Enregistrement complet :<\/strong> Toutes les exceptions sont enregistr\u00e9es avec des traces pour le d\u00e9bogage.<\/li><\/ul><p><strong>Exemple de fichier d'entr\u00e9e (<code>nombres.txt<\/code>):<\/strong><br \/>10<br \/>20<br \/>abc<br \/>30<\/p><p><strong>Exemple de sortie :<\/strong><br \/>Tentative de traitement du fichier : numbers.txt<br \/>Nombre invalide \u00e0 la ligne 3 : abc<br \/>Fichier trait\u00e9 avec succ\u00e8s. Total : 60.0<br \/>Tentative de traitement du fichier termin\u00e9e.<\/p><p><strong>Exemple de fichier journal (<code>file_processor.log<\/code>):<\/strong><br \/>2026-05-07 10:00:00,123 &#8211; ERROR &#8211; ValueError at line 3: could not convert string to float: &#8216;abc&#8217;<br \/>Si le fichier n'existe pas, le r\u00e9sultat peut \u00eatre le suivant :<br \/>Tentative de traitement du fichier : numbers.txt<br \/>Erreur : Le fichier 'numbers.txt' n'a pas \u00e9t\u00e9 trouv\u00e9.<br \/>Tentative de traitement du fichier termin\u00e9e.<\/p><h3><strong>Conseils de d\u00e9bogage avanc\u00e9s<\/strong><\/h3><p>Pour passer \u00e0 la vitesse sup\u00e9rieure en mati\u00e8re de gestion des exceptions :<\/p><ul><li><strong>Utiliser des d\u00e9bogueurs :<\/strong> Des outils comme <code>pdb<\/code> ou les IDE (par exemple, PyCharm, VS Code) vous permettent de parcourir le code et d'inspecter les variables lorsqu'une exception se produit.<\/li><li><strong>Exceptions personnalis\u00e9es :<\/strong> D\u00e9finissez vos propres classes d'exception pour des conditions d'erreur sp\u00e9cifiques dans les grands projets.<\/li><li><strong>Sentry ou outils similaires :<\/strong> Utiliser des services de suivi des erreurs pour surveiller les exceptions dans les applications de production.<\/li><li><strong>Tests unitaires :<\/strong> \u00c9crivez des tests pour simuler des exceptions et v\u00e9rifier votre logique de traitement des erreurs.<\/li><\/ul><h2><strong>Conclusion<\/strong><\/h2><p>L'impression d'exceptions en Python est plus qu'une simple astuce de d\u00e9bogage : c'est la pierre angulaire de l'\u00e9criture d'un code robuste et facile \u00e0 maintenir. En ma\u00eetrisant <code>try-except<\/code> en s'appuyant sur la <code>traceback<\/code> et <code>exploitation foresti\u00e8re<\/code> et en suivant les meilleures pratiques, vous pouvez g\u00e9rer les erreurs de mani\u00e8re \u00e9l\u00e9gante et obtenir des informations approfondies sur le comportement de votre programme. L'exemple concret fourni montre comment combiner ces techniques dans une application pratique, rendant votre code r\u00e9sistant et pr\u00eat pour la production.<\/p><p>Que vous soyez un d\u00e9butant apprenant les ficelles du m\u00e9tier ou un d\u00e9veloppeur exp\u00e9riment\u00e9 construisant des syst\u00e8mes complexes, comprendre comment imprimer et g\u00e9rer les exceptions fera de vous un meilleur programmeur Python. <a href=\"https:\/\/www.carmatec.com\/fr_fr\/\">Carmatec<\/a> permet aux entreprises de disposer d'un syst\u00e8me d'information robuste et \u00e9volutif. <a href=\"https:\/\/www.carmatec.com\/fr_fr\/societe-de-developpement-python\/\">Services de d\u00e9veloppement Python<\/a> sur mesure pour acc\u00e9l\u00e9rer <a href=\"https:\/\/www.carmatec.com\/fr_fr\/services-de-transformation-numerique\/\">la transformation num\u00e9rique.<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Python is renowned for its simplicity and readability, but even the most elegant code can encounter errors. When things go awry, exceptions are Python\u2019s way of signaling that something unexpected has happened. Knowing how to print and handle these exceptions is a critical skill for any developer, whether you\u2019re building a simple script or a [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":46521,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,76],"tags":[],"class_list":["post-46504","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-python"],"_links":{"self":[{"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/posts\/46504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/comments?post=46504"}],"version-history":[{"count":0,"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/posts\/46504\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/media\/46521"}],"wp:attachment":[{"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/media?parent=46504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/categories?post=46504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.carmatec.com\/fr_fr\/wp-json\/wp\/v2\/tags?post=46504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}