{"id":2062,"date":"2020-04-13T14:43:32","date_gmt":"2020-04-13T12:43:32","guid":{"rendered":"http:\/\/www.ardpylab.fr\/?page_id=2062"},"modified":"2020-05-10T15:47:19","modified_gmt":"2020-05-10T13:47:19","slug":"les-exceptions-gestion-des-erreurs-dans-les-scripts","status":"publish","type":"page","link":"https:\/\/www.ardpylab.fr\/?page_id=2062","title":{"rendered":"Les exceptions"},"content":{"rendered":"\n<h2 style=\"text-align: center;\"><em><strong>\u201dGestion des erreurs dans les scripts\u201d<\/strong><\/em><\/h2>\n<p>&nbsp;<\/p>\n<p>Lorsqu\u2019une instruction d\u2019un script ne se d\u00e9roule pas correctement (par exemple, une division par z\u00e9ro), une <strong>exception est lev\u00e9e <\/strong>ce qui interrompt le contexte d\u2019ex\u00e9cution, pour revenir \u00e0 un environnement d\u2019ex\u00e9cution sup\u00e9rieur, jusqu\u2019\u00e0 celui g\u00e9rant cette exception.<\/p>\n<p>Par d\u00e9faut, l\u2019environnement sup\u00e9rieur est le shell de commande depuis lequel l\u2019interpr\u00e9teur Python a \u00e9t\u00e9 lanc\u00e9, et le comportement de gestion par d\u00e9faut est d\u2019afficher l\u2019exception :<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"647\" height=\"82\" class=\"wp-image-2063 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript40.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript40.png 647w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript40-300x38.png 300w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<p>Pour g\u00e9rer l\u2019exception, et \u00e9viter la fin du programme, il faut utiliser la structure <strong>try<\/strong> et <strong>except<\/strong> :<\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 21px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">try:<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #808080;\"># bloc d\u2019instructions susceptibles d\u2019\u00e9chouer<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">except:<\/span><\/p>\n<span style=\"color: #808080;\"><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color: #808080;\"> # bloc d\u2019instructions \u00e0 faire en cas d\u2019\u00e9chec<\/span><\/span><br><br><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p>Toutes les exceptions lev\u00e9es par Python sont des instances de sous-classe de la classe <strong>Exception<\/strong>.<\/p>\n<p>La hi\u00e9rarchie des sous-classes offre plusieurs exceptions standard, comme <strong>ValueError <\/strong>(exception lev\u00e9e quand on tente par exemple de convertir en nombre une chaine de caract\u00e8res ne repr\u00e9sentant pas un nombre) ou <strong>ZeroDivisionError <\/strong>(quand on tente de diviser un nombre par z\u00e9ro).<\/p>\n<p>Il est possible de compl\u00e9ter la structure <strong>try except <\/strong>avec un bloc <strong>else<\/strong> et un bloc <strong>finally<\/strong>. Les instructions du bloc <strong>else<\/strong> ne sont ex\u00e9cut\u00e9es qu\u2019en l\u2019absence d\u2019erreur et les instructions du bloc <strong>finally<\/strong> sont toujours effectu\u00e9es quel que soient les erreurs rencontr\u00e9es lors de l\u2019ex\u00e9cution du bloc <strong>try<\/strong> ou en l\u2019absence d\u2019erreur.<\/p>\n<p>&nbsp;La syntaxe compl\u00e8te d&rsquo;une exception est alors :<\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 39px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">try:<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #808080;\">&#8230; # s\u00e9quence normale d&rsquo;ex\u00e9cution<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">except exception_1:<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #808080;\">&#8230; # traitement de l&rsquo;exception 1<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">except exception_2:<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #808080;\">&#8230; # traitement de l&rsquo;exception 2<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">else:<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color: #808080;\"> &#8230; # bloc d\u2019instructions ex\u00e9cut\u00e9es en l&rsquo;absence d&rsquo;erreur<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">finally:<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #808080;\">&#8230; # bloc d\u2019instructions toujours ex\u00e9cut\u00e9es<\/span><\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p><u><br>Exemple<\/u>&nbsp;:<\/p>\n<p>Ce programme demande \u00e0 l\u2019utilisateur de saisir un nombre et tente de le convertir en flottant et de faire une division avec ce nombre&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/python\/structure\/exception3.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"316\" class=\"wp-image-2072 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript41.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript41.png 684w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript41-300x139.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/a><\/figure>\n<\/div>\n<p><u>R\u00e9sultats dans la fen\u00eatre Python Shell<\/u>&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"223\" class=\"wp-image-2073 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript42.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript42.png 684w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript42-300x98.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<p>L&rsquo;instruction <strong>raise<\/strong> permet de lever volontairement une exception. Ainsi le script du programme pr\u00e9c\u00e9dent devient&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/python\/structure\/exception4.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"687\" height=\"312\" class=\"wp-image-2076 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript43.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript43.png 687w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript43-300x136.png 300w\" sizes=\"auto, (max-width: 687px) 100vw, 687px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p>Apr\u00e8s la conversion de la chaine saisie au clavier en nombre, un test est effectu\u00e9 sur le nombre, si celui-ci est \u00e9gale \u00e0 0, l\u2019exception <strong>ValueError<\/strong> est lev\u00e9e \u00e0 l\u2019aide de l\u2019instruction <strong>raise<\/strong>. Et bien-s\u00fbr si la chaine ne peut pas \u00eatre convertie l\u2019exception <strong>ValueError <\/strong>est \u00e9galement lev\u00e9e (c\u2019est aussi le bloc d\u2019exception du bloc <strong>try<\/strong>)&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"226\" class=\"wp-image-2077 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript44.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript44.png 686w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript44-300x99.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<p>Il est \u00e9galement possible de lever une exception avec l\u2019instruction <strong>assert<\/strong>. Cette instruction va tester la condition mise juste apr\u00e8s, et si elle est fausse, va lever une exception de type <strong>AssertionError, <\/strong>ce qui donne pour notre exemple&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/python\/structure\/exception5.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"345\" class=\"wp-image-2079 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript45.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript45.png 686w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript45-300x151.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/a><\/figure>\n<\/div>\n<p><u>R\u00e9sultats dans la fen\u00eatre Python Shell<\/u>&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"685\" height=\"225\" class=\"wp-image-2080 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript46.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript46.png 685w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript46-300x99.png 300w\" sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<p>La structure <strong>Try \u2026 Except <\/strong>est donc tr\u00e8s utile pour tout ce qui est v\u00e9rification des saisies au clavier. Mais contrairement aux scripts pr\u00e9c\u00e9dents, il est pr\u00e9f\u00e9rable que le programme ne s\u2019arr\u00eate pas si la saisie au clavier ne satisfait pas au programme.<\/p>\n<p>On utilisera pour cela une boucle <strong>while<\/strong>, afin de redemander \u00e0 l\u2019utilisateur une saisie au clavier si la pr\u00e9c\u00e9dente n\u2019est pas ad\u00e9quate, comme dans l\u2019exemple suivant&nbsp;:<\/p>\n<p>Dans ce programme, on demande \u00e0 l\u2019utilisateur de saisir un nombre sup\u00e9rieur \u00e0 0 et on v\u00e9rifie si c\u2019est un nombre premier.<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/python\/structure\/exception2.py\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"687\" height=\"532\" class=\"wp-image-2083 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript47.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript47.png 687w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript47-300x232.png 300w\" sizes=\"auto, (max-width: 687px) 100vw, 687px\" \/><\/a><\/figure>\n<\/div>\n<p><u>R\u00e9sultats dans la fen\u00eatre Python shell<\/u>&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"192\" class=\"wp-image-2084 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript48.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript48.png 684w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/pythonscript48-300x84.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/figure>\n<\/div>\n\n\n\n<p><u>Remarque<\/u>&nbsp;:<\/p>\n<p>L\u2019instruction <strong>break<\/strong> du bloc <strong>try<\/strong> permet, en l\u2019absence d\u2019erreur, de sortir de la boucle <strong>while<\/strong> et de finir le programme.<\/p>\n<p>&nbsp;<\/p>\n\n\n<div  class=\"grids-section grids-is-stretch\" style=\"--_gs-gap-desktop:0px 0px;--_gs-m-desktop:0 0 0 0;--_gs-p-desktop:0 0 0 0;--_gs-bg-desktop:transparent none;--_gs-bg-xp-desktop:0px;--_gs-zi-desktop:auto;--_gs-d-desktop:block;--_gs-mw-desktop:calc(100% - 0 - 0);--_gs-gap-tablet:0px 0px;--_gs-m-tablet:0 0 0 0;--_gs-p-tablet:0 0 0 0;--_gs-bg-tablet:transparent none;--_gs-bg-xp-tablet:0px;--_gs-zi-tablet:auto;--_gs-d-tablet:block;--_gs-mw-tablet:calc(100% - 0 - 0);--_gs-gap-mobile:0px 0px;--_gs-m-mobile:0 0 0 0;--_gs-p-mobile:0 0 0 0;--_gs-bg-mobile:transparent none;--_gs-bg-xp-mobile:0px;--_gs-zi-mobile:auto;--_gs-d-mobile:block;--_gs-mw-mobile:calc(100% - 0 - 0);--_gs-columns:2;--_gs-rows:1\"><div class=\"grids-s-w_i\">\n<div class=\"grids-area\" style=\"--_ga-column:1\/2;--_ga-row:1\/2;--_ga-m-desktop:0 0 0 0;--_ga-p-desktop:0 0 0 0;--_ga-bg-desktop:transparent none;--_ga-zi-desktop:auto;--_ga-d-desktop:flex;--_ga-mw-desktop:calc(100% - 0 - 0);--_ga-m-tablet:0 0 0 0;--_ga-p-tablet:0 0 0 0;--_ga-bg-tablet:transparent none;--_ga-zi-tablet:auto;--_ga-d-tablet:flex;--_ga-mw-tablet:calc(100% - 0 - 0);--_ga-m-mobile:0 0 0 0;--_ga-p-mobile:0 0 0 0;--_ga-bg-mobile:transparent none;--_ga-zi-mobile:auto;--_ga-d-mobile:flex;--_ga-mw-mobile:calc(100% - 0 - 0)\">\n\n<div class=\"wp-block-image\"><figure class=\"alignleft size-large\"><a href=\"https:\/\/www.ardpylab.fr\/?page_id=2024\"><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"28\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/03\/moins.jpg\" alt=\"\" class=\"wp-image-107\"\/><\/a><\/figure><\/div>\n\n<\/div>\n\n<div class=\"grids-area\" style=\"--_ga-column:2\/3;--_ga-row:1\/2;--_ga-m-desktop:0 0 0 0;--_ga-p-desktop:0 0 0 0;--_ga-bg-desktop:transparent none;--_ga-zi-desktop:auto;--_ga-d-desktop:flex;--_ga-mw-desktop:calc(100% - 0 - 0);--_ga-m-tablet:0 0 0 0;--_ga-p-tablet:0 0 0 0;--_ga-bg-tablet:transparent none;--_ga-zi-tablet:auto;--_ga-d-tablet:flex;--_ga-mw-tablet:calc(100% - 0 - 0);--_ga-m-mobile:0 0 0 0;--_ga-p-mobile:0 0 0 0;--_ga-bg-mobile:transparent none;--_ga-zi-mobile:auto;--_ga-d-mobile:flex;--_ga-mw-mobile:calc(100% - 0 - 0)\">\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large\"><a href=\"https:\/\/www.ardpylab.fr\/?page_id=2093\"><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"28\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/03\/plus.jpg\" alt=\"\" class=\"wp-image-106\"\/><\/a><\/figure><\/div>\n\n<\/div>\n<\/div><\/div>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>\u201dGestion des erreurs dans les scripts\u201d &nbsp; Lorsqu\u2019une instruction d\u2019un script ne se d\u00e9roule pas correctement (par exemple, une division par z\u00e9ro), une exception est lev\u00e9e ce qui interrompt le contexte d\u2019ex\u00e9cution, pour revenir \u00e0 un environnement d\u2019ex\u00e9cution sup\u00e9rieur, jusqu\u2019\u00e0 celui g\u00e9rant cette exception. Par d\u00e9faut, l\u2019environnement sup\u00e9rieur est le shell de commande depuis lequel [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2062","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2062","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2062"}],"version-history":[{"count":0,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2062\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}