Session du 27 janvier 2025 à 21h00
Veille & Discussions
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Session de mentorat TOSA sur la gestion des exceptions et l'usage d'exceptions personnalisées
Session de mentorat TOSA durant laquelle nous parlerons de la gestion des erreurs avec les exceptions et de l'usage d'exceptions personnalisées
00:00:30 :Est-ce que vous avez déjà été confronté à devoir gérer des exceptions qui étaient levées par du code que vous utilisiez par exemple par une fonction de la biotech standardet est-ce que vous avez déjà créé vos propres exceptions ?
00:00:44 :Pour ma part, non, moi je débute donc les exceptions que j'ai utilisées c'est ce qu'on m'a demandé dans les exercicesSinon de ma propre initiative, je n'en ai pas faitAlors on va regarder un petit peu quels critères, comment les utiliser et à quoi ça sert aussiet donc comme c'est une fonctionnalité de base de Python, des fondamentaux, sortir au TOSA également
00:01:20 :Est-ce que vous voyez tous mon écran ? En principe vous devriez voir la page d'accueil de Google sur ChromeOn va passer sur Colab, sur un autre book et puis on va regarder un petit peu çaLes exceptions en Python sont le cœur de la gestion des erreursDonc il y a deux situations où vous pouvez y être confronté
00:01:49 :Soit vous écrivez du code et ma foi le code que vous écrivez génère des exceptions et donc font cracher votre programmeou alors vous voulez vous-même lever des exceptions pour notifier les personnes qui pourraient utiliser les fonctions que vous écrivezqu'il y a eu quelque chose qui s'est passé pas comme ça devrait
00:02:16 :Typiquement on a ces deux situations, il faut bien comprendre qu'elles facilitent un petit peu la vie du Pythonistaet donc de la personne qui va coder en PythonCe qu'on voit souvent quand on travaille avec des personnes qui débutent en Python, ce qui est souvent mon cas dans mes accompagnements
00:02:40 :je vois souvent finalement des gens écrire des kilomètres de codealors ici on pourrait le symboliser comme ceciou les trois petits points qui se suivent pourraient finalement dénoter tout en programmedonc si on voulait même symboliser ça, on pourrait dire mon programmesous forme d'une fonction comme ça, donc l'entier du programme et puis except
00:03:09 :et puis en cas d'exception on peut faire quelque chose, parfois on voit même ce genre de code de débutici donc voilà le fond des exceptions, une exception c'est quelque chose qui va pouvoir nous notifier d'une erreuret qui va nous donner la possibilité de capturersi mon programme génère une erreur je pourrais la capturer
00:03:36 :par exemple, si mon programme génère une erreur, qu'est-ce que ça veut dire concrètement ?si mon programme, c'est juste une fonction pour l'instantsi mon programme génère n'importe quelle erreur, par exemple une value erreurune simple erreur levée dans mon programmesi je ne fais rien, mon programme va crasher
00:04:08 :ici, si j'exécute cette fonction et qu'elle lève une erreur à un moment donnéle programme va crasheret il se trouve que quand on débute et qu'on a un programme qui crashsouvent on n'est pas super contentet on va aller chercher sur Google des solutionset on va trouver très vite qu'une manière d'éviter que notre programme crash
00:04:40 :c'est effectivement d'entourer tout notre programme avec une exceptionavec un bloc try except plutôt, une capture d'exceptionet puis on pourrait faire ce genre de choses qui va capturertoutes les exceptions qui vont être levées par mon programmeet ensuite finalement les ignoreralors tout d'un coup, mon programme qui ne fonctionnait pas, fonctionne
00:05:06 :or ici, on a quelque chose qui est vraiment en gros anti-pattern en programmationc'est-à-dire que j'ai un système de capture d'exception qui vaquelque part capturer toutes les exceptions que pourrait lever mon programmesans distinction et les rendre complètement invisiblesdonc vous avez vu qu'un programme qui crashait, maintenant ne crash plus
00:05:32 :et parfois il est bien de faire crasher un programmec'est pas forcément une mauvaise chose, surtout lorsque vous développezpuisque lorsque vous développez, vous voulez découvrir égalementdes situations où votre programme ne fonctionne paset pouvoir agir ponctuellement sur ce programmealors essayons d'être un petit peu plus concret sur mon exemple
00:06:01 :actuellement mon exemple est trop génériqueet effectivement ne montre pas grand chosepremièrement, alors on va essayer d'être plus spécifiquec'est-à-dire que je peux essayer de capturer avec des exceptionsuniquement certaines exceptions mais pas d'autresalors le bloc try except permet d'être spécifique sur le type d'erreurque vous voulez pouvoir lever
00:06:33 :par exemple ici, si je sais que mon programme peut avoirpar exemple des problèmes de l'ordre d'une value-erreurpar exemple, je peux être spécifique avec çadonc ici, si je spécifie que je m'attends à ce que mon programmelève une value-erreur, je peux par exemple direok, une value-erreur c'est pas un problème pour moi
00:07:01 :je peux même éventuellement gérer cette value-erreursi je le désiredonc ici, imaginons que dans mon programmeje veux gérer spécifiquement cette value-erreurje peux la mentionner directement iciet faire en sorte que cette value-erreursoit gérée d'une manière ou d'une autreeffectivement, si mon programme génère une value-erreur
00:07:35 :finalement, mon programme ici se termineon voit que je n'ai aucune erreurparce que j'ai dit, j'ai prétenduque je sais quoi faire de cette erreur làtandis que si je sais quoi faire par exemple d'une index-erreurmais je ne sais pas quoi faire d'une value-erreurenfin ici, capturons une index-erreur
00:07:57 :et puis on voit que mon programme va crasher malgré toutparce qu'il lève une erreur qui n'était pas planifiéetandis que si mon programme lève une erreur qui est géréequi est planifiée icieffectivement, on n'aura plus d'erreurparce que je sais quoi faire de l'index-erreurdonc ici, se dire qu'une erreur en soi
00:08:18 :ce n'est pas forcément quelque chose de problématiquec'est quelque chose qui va intervenirparce que l'utilisateur a par exemplefait une action qui n'était pas immédiatement prévue par mon programmedonc mon programme peut lever une exceptionmais à l'extérieur de mon programmeje peux éventuellement savoir gérer ce truc
00:08:40 :par exemple, imaginez un programme ou une fonctionqui va devoir aller chercher des choses sur le webon peut imaginer plein de chosesplein d'erreurs différentessi on va chercher des choses sur le webpar exemple, on peut imaginer que l'URL que j'ai utiliséepour aller chercher quelque chose sur le web
00:09:03 :donc l'adresse web que j'utilisepour aller récupérer des informations sur le webest erronéedans ce cas, j'ai un problèmej'ai un problème si cette URL est erronéeparce que si je réessaye dans 5 minutesdans 10 minutesdans 1 heuredans 3 heuresj'aurai toujours un problème d'URL
00:09:27 :à l'inversesi c'est un problème de réseaualors à ce moment là, c'est peut-être différentimaginez que votre programmese connecte au réseauil va essayer de récupérerdes informations sur le webet ensuitetraiter ces informationset retourner un résultatsi au moment où vous exécutez votre programme
00:09:50 :vous êtes en train de passer devant un tunnelet vous n'avez plus de 5Gà ce moment làvotre programme va échouermais si vous réessayez 30 secondes plus tardpar exemplevous allez avoir un programmequi réussitparce que le réseau sera nouveau disponibleencore qu'en France, on peut se demander
00:10:15 :si le réseau sera encore disponiblemoi j'habite en Suisselà où il y a toujours du réseauparce que les villes sont séparéesde moins de 20 minutes les unes des autresmais vous avez des grands espaceschez vousdonc l'idéec'est que les erreurs peuvent être de multiples natures
00:10:33 :première choseà essayer de bannirc'est quand je veux gérer des exceptionsjamais dans votre codejamais grandieux jamaisvous devriez avoir un except tout nupar exempleun except tout nuveut dire qu'il va capturern'importe quelle exceptionde quelque nature qu'elle soitsi c'est un indexerreursi c'est une zéro division erreur
00:10:59 :par exemplelà elle sera capturée dans mon exemplesi j'ai une exceptionsimplement exceptionpareil exceptionquelle que soit la nature de l'exceptionqui sera levéeen mettant un exceptvous êtes sûr d'avoir un trou noirà exceptionet de capturersi vous êtes spécifique à ce niveau là
00:11:25 :vous capturez que l'exceptionque vous avez levéedonc si j'ai une zéro division erreuricitypiquementle programme va cracher malgré le fait que j'ai untry except dans mon codevoilàça c'est le contextetrès globalmaintenant comment est-ce qu'onfinalement va utiliserces exceptionsalors imaginez-vousdans l'élaboration d'un programme
00:11:55 :dans lequel vous allez utiliser des fonctionspour coderdifférentes fonctionnalitésimaginons qu'on veut iciavoir une fonctionqui va permettre de downloaderune web pagepar exempleok par exempledownload docstringalors à ce moment làon va devoirutiliser une fonctionà l'intérieur qui va pouvoirfaire l'appel réseau
00:12:27 :donc qu'est-ce qu'on va vouloir faireon va vouloir aller chercher une page webà une certaine URLà une certaine adresseet rapatrierle contenu de cette page webqui va être encodéed'une certaine manièreon va vouloir décodercette pagepuis ensuite on peut faireplein de choses mais imaginons que ici je veux simplement
00:12:51 :retourner le codeHTML de cette page làde nouveauqu'est-ce qui peut arriveralors soyons plus générique quand mêmeimaginez que je vais aller récupérerune web pageet pour celail va me falloir une URLdonc première chose qui peut arriverdans mon codec'est que la personne qui utilise
00:13:15 :cette fonctionokelle ne donne pas d'URLimaginez que la personnequi utilise cette fonctiondownload web pageje pourraisdéjà m'économiserici appelle cette fonctionsans rien lui passeralors Python vaautomatiquementvous retourner déjà unetype errordonc a priorivous n'avez rien besoinde coder en particulier
00:13:51 :pour que Python vous diseok vous utilisez malcette fonction downloadweb pagevous ne lui passez pasune URLet il vous le dit icimais imaginez quevous lui passez une URLhop ici je lui passeune URLtechniquement je lui passe une URLparce que je passe un argument ici
00:14:17 :et qui sera associé au paramètreURLseulement ce n'est pas une URLdonc là je n'ai plus d'exceptiondéjà mon codepasseet j'ai toujours un problèmeparce que ma fonction ne sait pas trop quoi faireelle ne sait pas quoi aller cherchericialors première choseje peux ici
00:14:41 :faire un premier testpremièrement on pourraitvérifierque s'il n'y a pas d'URLalors if not URLici on va faire quelque chosequand est-ce que ce testif not URLest vraiest-ce que vous pouvezest-ce que vous arrivez à me diretoutes les situationsoùce if not URL
00:15:11 :est vraiavec la chaîne de caractèrevide comme tu as mis làavec celle làdonc ici on va dire vraisi URLvautça okqu'est-ce qu'on pourrait imaginer d'autrecomme situationa priorion pourrait imaginerque c'est fauxsi c'est nontechniquement c'est fauxà partir du moment
00:15:51 :où je ne mets pas une adressequi commence par HTTPSaprès une URLvalidedonc une URL valideune URL validecommencepar HTTPSéventuellementSest suivi d'un domaine valideetc etcici déjà pour votre fonctionvous avez plusieurs chosesque vous pouvez mettre en placepourfaire un test de validité
00:16:31 :on peut rester très simplec'est à dire en testantcomme ça if not URL si au moinsc'est pas quelque chose de videdonc différentes chaînes videset différentes nonje pourrais déjàou je pourrais tester déjàsi c'est une chaîne de caractèreet s'il n'est pas videif instant
00:16:54 :instantURLet puis on va dire chaîne de caractèreURL stringok donc là on a éliminé tout çaon vérifie simplement qu'elle n'est pas videet si elle est videalors if not URL ornot instantstringdans ce cas là on va par exempledire c'est une valeur
00:17:21 :non validevalue errorl'URL doit être une chaîne de caractère non videpar exempleokceci va entraînerfinalementun crashun crash de l'usage de ma fonctionest-ce que c'est mauvaisque cette fonction crash dans ce contextenonparce que ça permet d'informer le développeurokqu'il a mal utilisé
00:17:55 :sa fonctionet c'est quelque chose même qu'on peutici documenterpar exempleà un moment donné vous décrivez la fonctiondes descriptionsici de la fonctionet puis on peut décrireici par exemplevalue error l'URLdoit être une chaîne non videon va lui dire par exempleok si on lui passe
00:18:25 :une chaîne vide on va recevoir une value errorça c'est une des exceptions possiblesdeuxième chose qui peut se passermaintenant c'est sije retournela chaînedirectementon va utiliser iciurllib pour le couppuisqu'on nous est en trainde prendre la bibliothèque standarddonc urllib.request
00:18:55 :et puis on va faire un returnici de urllib.request.urlopen et on vaouvrir la pageweb qu'on va chercheralors effectivement je programmequelque chose autour d'une fonctionPython qui existe déjàet on va aller lirele contenuet on va éventuellementle décoderon va présupposer qu'il est encodé
00:19:31 :en UTF-8 par exemple et on vale décoder pour obtenirune chaîne de caractère Pythonpas une ByteStreamdonc si jamais vous n'êtes pasà l'aise avec urllibn'hésitez pas à aller par exemplesur la doc de la bibliothèque standarddonc docpythonicivous allez sur la library
00:19:55 :reference ou vous passez en françaissi vous n'êtes pas à l'aiseurllib ici et urllib.request icivous avez toute la doc depar exemple urlopenc'est de la doc donc si c'est indigesteje vous recommande iciun site qui s'appellepython module of the weekpymotpython module of the week
00:20:19 :etdonc c'est un site de tutosur la bibliothèque standard qui est fait parun des core dev de Pythonet là dedans vous cherchez urllibvous avez urllib.request ici et puis un tuto
00:20:33 :de très bonne facturequi vous apprendra à l'utiliseret donc aller chercherdes informations sur le webuniquement que la bibliothèque standard de pythonsans rien installerdonc ici on va chercherdes informationsil se trouve quel'url actuellement elle est videmaintenant je décidequ'elle soit plus vide
00:20:57 :alors docstringest-ce que c'est www docstringc'est juste wwwlà je vais me faire taper sur les doigtsmais hopdocstring.frpour le coupc'est bon alorson va venir làetdocstring.fr
00:21:23 :et voilà on a téléchargéle contenude docstringtoutefoisici il peut arriverplein de chosesqu'est-ce qui peut arriver selon vousil va y avoir un souci d'encodagenon ?
00:21:53 :alors là je pourrais très bien recevoirdu contenuqui n'est pas encodéen utf-8c'est plus en plus rare sur le webmais c'est très possible techniquementet donc il n'arrive pas à décoder çaokdonc je pourrais avoir eu une erreurde décodagecomment savoir ce qui va se passer
00:22:15 :en cas d'erreur de décodagepar exemple on peut faireest-ce que ça va fonctionnersi je prends une chaîne de caractèreje l'utiliseencodeet puis on va encoderen latincomme çaje décode ça comme si c'étaitdu utf-8est-ce qu'il me donne une exceptiondonc probablementdonc ici ce que j'ai fait
00:22:57 :une bonne techniquepour savoir ce qui va se passersi j'ai un problème de décodagevous prenezune chaîne de caractèretypiquement du français avec des accentsvous l'encodezen latin 1c'est plus ou moins une variantede ce que vous allez avoirpar exemple sur Windows avec l'encodage par défaut
00:23:19 :ou historiquementdans les pays francophonesou du latindonc on encode çasur en latinon va prétendre que c'est du unicodeversion utf-8et on le décodedonc évidemment on a encodéd'une manière notre texteici pythonet on l'a décodé avec autre chosedonc il n'est pas content
00:23:45 :donc si ce qu'on reçoit du webest encodéselon par exempledu latin 1et qu'on le décode en prétendant que c'estde l'utf-8à ce moment là on aura une erreurpour l'instanton ne l'a pas mais on pourraitl'avoir donc ce unicodedécode erreuret typiquement c'est ce décode utf-8
00:24:09 :qui pourrait élever çaok donc se pose la questionà ce stadequ'est-ce que je faiset surtoutil faut vraimentprendre votre casquettede développeuret vous poser la questionde deux points de vuepremier point de vuec'est que vous développez une fonctionqui fait quelque chose
00:24:35 :dans notre contexte cette fonctionva aller chercher des informations sur le webet dans un autre contextec'est que vous êtes utilisateurd'une fonctionqui a été faite pour vousça va donner quelque choseil se peut qu'en tant que développeur vous soyezdes deux côtés de çaque vous soyez le développeur de cette fonction
00:24:55 :et que vous utilisiezcette fonction par ailleursdans votre codeici vous avez un choix à fairevous avez un choix à fairequi estest-ce que je laisse passer ces erreursauquel casc'est l'utilisateur de votre fonctionqui devra les gérerpar exemple typiquement là vous voyezque je fais un return
00:25:19 :url, livre, request, url open, read, decodec'est une longue chaînemais finalement ici je récupèrela page webensuite je liscette page webet ensuite je décodecette page webdéjà là il peut y avoir une multituded'erreurspremière erreur possibleje récupère la page webne pas avoir de réseau
00:25:45 :lorsque je faisun cours en présentielà l'université où je travaillesouvent ce qu'on fait à ce moment làc'est qu'on coupe le réseaualors là j'ai un problème de mentorat en lignec'est que je ne peux pas le faire sinon je vous perdsmais icipeut déjà intervenir une première erreur
00:26:03 :pour savoir cette erreurpour connaître cette erreurqui est de typeurl libreurl librepoint erreurpoint url erreurdonc icil'erreur qui vous est renduesuppose que l'url n'est pas bonneparce qu'il n'arrive pas à téléchargermais vous pourriez très bien ne pas avoir de réseaudans les deux cas l'effet est le même
00:26:33 :c'est que vous ne récupérez pas la ressource en ligneokmais du fait quenous n'avons pas géré cette erreurfinalementça va êtreà l'utilisateur de votre fonctionéventuellement vous, de faire éventuellementun trydownload web pageici récupérerle résultat de la page webdonc web page code
00:26:59 :par exempleici vous allez récupérerle codes'il y a une erreur réseauexceptici url librepoint erreurpoint urlerreurfaire quelque chosedonc icije dois également importerurl libre point erreurdonc icije disdans ma fonction je ne gèrepas ça, je vais documenter
00:27:35 :éventuellement ceciici une erreur d'urlou de réseauoude réseauest survenueet la personnequi utilise ma fonction elle doitse taperalors ici une valueerreur si le caractère est vide ça nonmais par contre elle va se devoirégalement de se taperune unicode des codes
00:28:03 :unicode des codeserreuricisi je volontairementje documente la fonctionde manière assez verbeusedonc si je suis utilisateur de çaje vois que cette exceptioncette fonction peut me faire un petit peutout ça, donc quelque partje vais devoir décider ce que je faisà chaque fois
00:28:27 :par contre iciqu'est-ce que je fais s'il y a une erreur d'encodage dans ce que je reçoisce que je fais sidonc ici exceptdownload unicodedes codes erreursunicode des codes erreursc'est bonbien sûr c'est pas tout ça que je veuxc'est juste çaetcdonc vous voyez que
00:28:59 :finalement il y a une listealors ici, il y a une première erreurqui peut arriver, c'est sij'ai passé n'importe quoi à ma fonctionmoi je sais que j'ai pas passén'importe quoi à cette fonctiondonc l'erreur d'URLje devrais pas avoir à la gérermais techniquement vous pouvez la gérer
00:29:17 :etcdonc voilà icij'ai typiquement une fonctionqui ne fait pas de gestion d'erreurqui n'utilisepas d'exceptionet pour le coupc'est le code, c'est votre codele code qui utilise cette fonctionqui va devoir faire l'effortil est pas obligélui de faire tout l'effortici je peux imaginer
00:29:43 :que j'ai une fonctionc'est une fonction de votre codequi fait tout çaet elle est pas obligée de gérertoutes les exceptions elle mêmeet vous pouvez déciderl'erreur d'encodage je le gère paset plus bas dans votre codec'est au moment où vous aurezque vous utiliserez
00:30:05 :une fonction par exempleque vous allez devoir géreréventuellement çadonc vous voyez que les exceptionsvous permettent de gérer les erreurssur plusieurs niveauxc'est à l'intérêt de Download Webpageque j'ai une exceptionqui est levée par exemple pour le décodageune fonctionAppel Download Webpageici qui gère
00:30:31 :uniquement les problèmesde téléchargement de réseaud'URL mal formé etcet il ne gère pasles problèmes d'encodage et puis à un moment donnéici la fonction peut êtreil gère les problèmes d'encodagedonc les exceptions c'est quelque chosequi va vous servirdans la gestion d'erreursur plusieurs niveaux
00:30:53 :finalement d'appelplusieurs niveaux d'appelici j'ai le code principalon peut dire qu'ici on est dansle codeprincipaléventuellement fonctionmain par exempleou simplementle module qui vous serviraà lancer votre programmece module va appeler une fonctionqui est définie quelque part ailleurset cette fonction elle même
00:31:21 :va appeler une fonction qui est définieencore ailleurs, la fonction la plus intérieureà une erreuret il va falloir la gérervous pouvez la gérer directement au niveaude Download Webpage, vous pouvezla gérer dansle niveau appelantou alors au niveau le plus élevéde votre programme
00:31:41 :n'hésitez pas à tout moment à me couperalors commentest-ce que je vais décideroù je vaisfinalementutiliser ces exceptionson est icidans une logiquede design d'interfaceça ne vous parle pas beaucoupmais finalementtout votre métier de développeurva tourner là autouren faitau jour le jour
00:32:11 :vous allez pratiquement faire ce qu'on appelledu design d'interfacec'est à dire qu'au jour le jourvous allez créer des fonctionset vous allez devoir imaginercomment est-ce quel'utilisateur de votre fonctionva devoir gérertout çasi j'efface tout çaon peut se reposer maintenant la questionquelles sont les options
00:32:35 :quelles sont les optionspour notre utilisateur iciou pour notre concepteurde Download Webpageicion va se remettre logstringet finalementest-ce que je suis obligé de laisser passercomme je le fais iciou est-ce que je peux gérerles exceptionsdirectement à l'intérieurde ce Download Webpage
00:33:03 :alors il n'y a pas de réponseabsolue à çade manière généraleessayez toujours de gérerles exceptions dès que vous le pouvezalors dès que vous le pouvezça veut dire quoipar exemple, imaginons que ce codeicivous ne faisiez pas directementde returnmais imaginons que vous récupérez
00:33:31 :le résultat de votre pagedéjàon peut ici récupérerla réponseje ne décode paspour l'instantlà, sur la réponsej'ai la possibilitédéjà à ce stadede gérerexcepturllib.error
00:33:57 :etcalors, est-ce que je faisun print, est-ce que je fais quelque chose icien faità chaque étapevous pouvez vous poserla question, qu'est-ce que je vais faired'une erreur, ici typiquementj'ai icicetteinstructionle statementicipeut échouersi l'urln'existe pasou plutôt si le domaine n'existe pas
00:34:35 :doncsi le nom de domaine n'existe pasousi vous n'avez pas de réseauvous n'avez pas de réseaualors dans ce casqu'est-ce que je faiss'il n'y a pas de réseau, est-ce que je signaleest-ce que je signale passi on veut vraimentaller au bout des choses, par exemple
00:35:03 :retourner une page web videqu'est-ce qui m'interditde faire çasi la page n'existe pasma fonctionva pouvoir retourner une pageweb videtandis que siil récupère le contenu en ligneje vaisfinalement retournerdu contenuqui est celui-làça peut être une possibilitéimaginez que si je vais plus loin
00:35:33 :que j'analyse même le contenu de cette pagepar exemple je vais surdocstring.fret je veux retourner une listede tous les cours proposéspar docstring, je pourrais retournerune liste avec les titres de chaque courset si j'ai une erreur réseauje peuxretourner une liste videtandis que si
00:35:55 :je récupère bien cette listeje vais retournerc'est une manière de signaler une erreursi je veux obtenir une informationqui se présente sous la forme d'une listeet que je reçois une liste videalors j'ai une erreur. Ici
00:36:09 :si je veux obtenirune réponsealors ici on varesponseégal rienet puis on fait un returnun return de notre responseici pour l'instantun returnet là j'ai géréune erreur. Est-ce que
00:36:33 :c'est la bonne façon de gérer l'erreurça c'estuniquement le programme, le contexteapplicatif dans lequel vous allez travaillerqui va nous le diremais ce qui est déjà sûrmaintenant c'est que je peux éliminerdans cette fonction làde cette liste làune erreur déjàmême choseje pourrais ici me dire
00:37:03 :ok maintenantj'essayede décoderdonc ici on va direque response devientdataj'essaye de lireet de décoderet puis éventuellement làje décodeet si j'ai une erreur de décodagemême choseà l'extrême de nouveaudire que je n'ai pas reçude donnéeset je retourne des données vides
00:37:37 :si j'ai eu des exceptionsdonc même chosej'ai géréà l'intérieur de cette fonctionla problématiquequi m'était donnée icietje vais devoir pour le coupje peux maintenant effacercette ligne làpour le coupje peux probablementeffacer également cette premièreligne je vais juste voir ce que
00:38:07 :donnerait par exemple on peut essayer de voirce que donneraiticique donnerait URLOpensi je lui passeune URL qui est videelle va retournerelle même déjà une valueErrorok doncpour le coup icije peux décidersoit d'éliminer çaparce queiciil y aura déjà une valueError
00:38:39 :et rien ne m'empêche iciégalement de faireun exceptavec une valueErroret puisune réponse videok maintenantThierryouiexcuse moi c'est juste une question sémantiquemais pourquoi parfois tu mets asquelque chose et parfois nonc'est une question bête je sais pasnon il n'y a pas de question bête déjà
00:39:07 :premièrementen fait une exceptiondonc une exception elle a deux chosesil y a un typeet il y a unevaleur si vous voulezpar exemple si je veuxlever moi même une exceptionje vais utiliser le motclé Raise et puisle type de l'exceptionet puis vous voyez c'est comme si je
00:39:31 :prends une classe ici ma classepar exemple ma classeet puis je lui passe des valeurs icic'est ce qu'on appelle une instantiationje crée un objet à partir d'une classeici c'est pareilici quand j'ai une erreurje vaisinstantier la classe valueErrorlui donner le nom dans le message
00:39:51 :et ça ça va créer un objetokcet objet je peuxle récupérerc'est à dire que quand il y a une exception qui a étélevée ici je captureici juste en fonction du type je dis oksi il y a une exceptionde type valueErrorqui est levée
00:40:11 :je rentre ici dans cette branche làet je vais exécuter le code qui est là dedansmais pour autantça me donne justeque je me base juste sur le type de l'erreurmais je n'ai pasl'exception à un particulier par exemplequand on fait un raiseiciraise value
00:40:31 :valueErrorlàvous voyez il y a un messageok donc à l'intérieurde cette fonction urlOpenquand il détectequ'il n'y a pas de réseaupar exemple il va leverune exception de type urlErroret il va lui donnerquelque chosecomme çaun message on peut essayerici urlOpen
00:40:59 :htpsdocstringet puis je metsplein de petites lettres à la fin .frdonc je prends une urlqui n'existe pasokdonc j'ai bien une urlErrorqui a été levée et il y a bienun texte qui est associéname hors service not knowniciicidonc je peux
00:41:29 :capturer ça mais si je veux capturerce texte là par exempleje peux maintenantle capturer cette exceptionpas celle là maiscelle làici en disant aset puis lui donnantexceptiondonc c'est l'objet exceptionon a souvent tendance à le nommer eici mais vous pouvez lui donner
00:41:53 :le nom de votre grand-maman si vous voulezça c'est une variablequi va contenir ensuitel'objet représentant l'exceptionici je peux faireen printdans un vrai programme on va éviterprint et on va plutôt logueravec logging.error
00:42:11 :ou exception iciexception et puis on vaajouter un textelà qui contiendra l'exceptionmais mettons en print pour l'instantprint et .messageok et puisici docstring et puison testealorsdéjà ici la valueerrorla chaîne non videelle n'est pas videok donc làj'ai capturé
00:42:53 :une exception qui est iciil se trouve que pour le coupça génère une autreexception puisque ici j'ai misune chaîne vide et puis làla chaîne viden'a pas de méthode readdonc ici ça échouedonc ici la chaîne videne serait pas la bonne choseà mettre ou alors je fais directement
00:43:15 :ici en returnvide et puis en returnvide icipour éviterqu'on arrive sur la suitedu programme et effectivementce qu'on va voir icic'est queicil'exceptionn'y met rienqu'est-ce que je dois faire pour aller chercher dans cette exceptionon pourraitici aller voiron va faire en print de dire
00:43:47 :alors direpour ceux qui ne savent pasje ne suis pas sûr que je rentre icion a passé çaqu'est-ce qu'on a fait avantça on a euune URL erreurautant pour moic'est iciqu'on a passé n'importe quoion a eu l'URL erreurdonc ici as et
00:44:11 :et puis pour le coup si je mets en printet icicapture puis voilàon capture l'objetet puis iciplutôt que d'afficher l'objetje peux juste afficher le messageokj'aurai accès icidans ce type d'exception làet puis là vous aveztout ce que contientcette exception là
00:44:45 :la reasonici par exemplequi est la raison pour laquelle il a échouéok.reasonet puis il vous donneil vous décritla raison pour laquelle on a reçuici ce texte làon a ce print qui a été faitsi vous ne voulez pas faire en print vous pouvez
00:45:11 :loguer un grès dans un fichier de logpar exemplecomme ça vous avez le détail de pourquoil'appel de fonction a échouédonc récupérer ici ceas et permet d'en savoir plussur l'exceptionou alors si vous n'avez pas besoin d'en savoirplus ça vous suffit de savoir que c'est une URL
00:45:29 :erreur à ce niveau làvous n'avez pas besoin si vous ne faites rien avecce e vous n'êtes pas obligéde le mettreokdoncdonc voilà en faitdeux styles de programmationqui font que la premièretoute première version de notre download.web page
00:45:51 :on allait documenteralors même maintenant on n'a plus besoin de çaon n'a plus besoin de ce chapitreraises dans notre docstring icion peut juste documenterce qu'on gère en internece qui se passe c'est que je reçoisune chaîne videdès que j'ai une erreurdonc l'utilisateur ici
00:46:11 :n'y voit que du feuil cherche un sitesi ce site n'existe pas il reçoit justeune chaîne videpar contre si il cherche docstring.fr
00:46:21 :il va recevoirdu textedonc quand ça réussit il a du texte quand ça ne réussit pasil n'a rienc'est une manière de gérer les erreursaussi okl'avantage c'est qu'ici l'utilisateurde download web pagen'a pas besoin de se préoccuper de savoir s'il a deserreurs à gérer
00:46:43 :et c'est une fonction qui est complètement intégréedonc vous voyez quequand je gère les exceptionsle plus proche possible du codequi lève cette exceptionje vais permettre de simplifierprobablement le code en amontpar contreje n'aurai plus cette possibilitéici lorsque j'utilisedownload web pagede réagir face aux
00:47:09 :différentes erreursc'est quelque part le concepteuret l'écrivain de lafonction download web pagequi aura pris cette décisionpour vousévidemment là vous pourriez encoredire pageégal etcet puis ici if notpagevous pourriez encore gérerce que vous devez fairesi vous n'avez pas reçu de contenu
00:47:39 :à ce niveau là par exempleou alors if pageet puis là vous allez écrire du codeseulement si vous avez reçudu contenumais c'est tout ce que vous avez comme possibilitévous n'avez plus de possibilitéde gérer les erreurs d'encodagepar exemple parce quece ne serait pas du TF8
00:47:59 :alors si ce n'est pas du TF8j'essaye latin par exempledonc ici je pourrais très bien direTF8 donc icifaire un readune fois qu'on a faitle readdataégaldata.decode
00:48:19 :là et puisici si ça échouedata.un datadécodelatin 1 par exemplesi vous savez que vous êtes en Francepeut être des possibilitésque le latin 1 fonctionnesi le TF8 n'a pas fonctionnéici je peux décidersi le concepteur décide ce qu'il faitici l'appelant
00:48:45 :la personne qui utilise la fonctionn'a plus la possibilitéde jouer avecla même finessedonc vous voyez qu'il y a des avantageset des exceptions à gérerune exception localementsi je gère les exceptions localementil va perdre en flexibilitési je laisse passer les exceptionsc'est le code appelant qui devra tout faire
00:49:09 :comme dans mon exemple au tout débutoù on ne faisait rien au niveau de la fonctiondownload web pageet c'était le code utilisateurqui devait faire un try exceptpour s'assurer quele code n'allait pas crashern'allait pas échouerune dernière chose que je veux vous montrerc'est que parfois
00:49:29 :c'est la première stratégie que je veux utiliserdoncon va voir si à coup dectrl z on arrive à revenir un petit peu en arrièreça fait mal à la tête un petit momentmaison y arriveicije reviens à mon code initialremet en returnici
00:50:01 :et nous avionsdonc un read d'abordet un decodeokdonc icije veuxfaire un downloadd'une nouvelle page et puis on a vu qu'il y avait toutes ces exceptionsqui peuvent arriveralors il y a une exceptionstandard valueerrorça semble relativement normalque celle là soit utilisée
00:50:33 :si jamais je passen'importe quoi icià urldonc gardons làunicode decodeerrorpeut être qu'on peut la garder ou paset puis ça ça devienton commence à avoir unensemble hétérogèneded'exceptions qui seraientlevées icidonc ici des exceptionsstandard puis des exceptionson va dire standard
00:51:03 :mais non standard puisque ça appartientà une bibliothèque de labibliothèque standard ou un modulede la bibliothèque standardj'ai possibilité de cacherà download web pagece détail làje peux ici par exempleici avoircréé une exception qui seraitdownloaderinvalidurl par exempleet puissi
00:51:33 :letéléchargement échoueje peux très bien vouloirfaire ici undownloaderon va y arriverdownloadernetworkerroret puissi j'ai un problèmede décodageimaginons que mabibliothèque s'appelle downloaderdownloaderdecodeerroret puisau dessus de ça, tout çac'est des erreurs de ma bibliothèquedownloadererreuralors je peux très bien utiliser
00:52:23 :des exceptions personnaliséesà quoi ça va servirça va servir que iciok, il va faire untry exceptet déjà s'il veut capturerl'une, n'importe laquelle de cesexceptionson voudrait qu'il puisse avoir une erreur génériquecomme celle là par exempleexceptexceptdownloader error et puisil va faire downloader error
00:52:51 :et puis il va faire le nécessaire iciou alorss'il ne veut pas être générique, il va utiliserces différentesexceptions làpourgérer ceserreurs par exempleil veut gérer le cas d'une urlinvalide et puis il veut gérerle cas de la network erroroket puis
00:53:21 :d'autres cas éventuels qu'on pourraitgérer comme ladécode erreurdonc de manière générale on pourraitaller comme çaça va donner un petit peu plus de génériqueici puisqu'à la place de launicode décode erreur, j'aurai monerreur downloaderdécodeerreuret puis ici à la placede toute cette chaîne là dont on sait
00:53:47 :trop que faireen tant que débutant dans l'usagede download web pageje peux avoir une exception downloadicinetworkerrordonc c'est une autre stratégiequi va impliquerque c'est la fonction elle même qui vadevoir gérer et leverles bonnes exceptions. Pour ça
00:54:11 :je vais devoir créer les exceptionsalors comment est-ce qu'on crée des exceptionsde manière simpleici au plus simpleon va créer une exceptiongénérique, ici qui s'appelledownloader error, vous créez une exceptionvous créez une classe qui s'appelledownloader error, simplement cette classeva hériterde exceptionet puis après vous pouvez créer
00:54:35 :toute une hiérarchie d'exceptionsdonc ici j'ai créé une exception génériquequi s'appelle downloader error, ça voudraitdire toutes les erreurs qui peuventêtre levées par cette fonctionet ensuiteje peuxcréer des erreurs plus spécialiséesqui vonthériter de ce downloadererror iciet par exemplec'est le cas de ces différentes
00:55:01 :exceptions icidoncdownloader invalide urldownloader network error, downloaderdécode error, donc icivous avez cetteerreur parenteet puis ces éventuelleserreurs icispécifiques, dans l'usagede Webex je peux par exempledécider queje vais uniquement gérerles downloadererror de manière spécifiquecomme çaet puis toutes les autres
00:55:35 :les downloader errorinvalide url ou décode urlje les gère de manière génériquepar exemple je décide simplementde faire un print pour avertir l'utilisateurou un log pour avertirl'utilisateur que quelque chose s'est passéet ensuite je laisseexploser l'exceptionje gère avec un printet ensuite je fais
00:55:57 :ici un raisequi va simplementréexécuter ou relever cetteexception làalors icipour maintenant que ma fonction gèreces erreurs, vous pouvezdonc faire ce qu'on a fait tout à l'heureresponse iciresponse égalececiet donc je fais un tryexceptje vais capturercette exceptionqui peut être à ce
00:56:31 :niveau là une url libreerror url erroret moi je décide derrièrede faire un raise de ma propreexception qui s'appelle downloadernetwork erroriciet ici downloadernetwork errorc'est ce que ma fonctionva déclarer comme exceptionpossible si jamais j'ai une erreurou d'exception ou de réseau
00:56:57 :okdonc pour le coupcette fonction là ne vaplus jamais leverd'urli.error.urlj'ai utiliséune exceptionpersonnalisée pourclarifier l'interfacede ma fonction, donc quand je parled'interface de fonction, de quoije parle, je parledes paramètres que vontaccepter ou des arguments que vont accepterla fonction, donc ici
00:57:27 :cette fonction accepte une chaînede caractère qui sera nomméeurl, d'ailleurson ne sait pas actuellement que c'est une chaînede caractère, soit j'utilise les types intpour guider notreutilisateur, soitje décidede documenterma fonction en lui disant d'utiliserune url sous la formede string et
00:57:51 :je vais retourner ici unechaîne de caractère, maiségalement je vais préciser lesexceptions qui serontpotentiellement levéespar download webpageces exceptions ça peut très bienêtre mes propres exceptionsplutôt que d'être des exceptionsgénériques, et ici pareilsiun trycontentici unicodeplutôt qu'unicodedécodeerror, j'ai ma
00:58:23 :mon downloader décodeerrorlà hopqui prévientdownloader, alors unicodeerrordownloader décodeerror, voilà hopqui prévient queici on a eu un problème de décodagequi retourne le trucvous voyez donc, icidonc je peuxfaire que, ok mafonction ici elle ne gère rien, elle va quand mêmelever des exceptions
00:58:49 :mais j'ai uniformisécette interface d'exceptionici, mes fonctions, toutes les fonctionsqui sont liées à mondownloaderbibliothèque qui s'appellerait comme çavont toutes retournerdes exceptions qui ontdes noms uniformisésdes noms qui se rapportent directementà ma fonction et quiseront faciles donc pour le coupà deviner, à utiliser etc
00:59:15 :c'est par exemple la stratégiequ'utilise une bibliothèquecomme Request, pour ceux d'entrevous qui l'ont peut-être utiliséRequest est une bibliothèque qui remplaceurllib, qui simplifieurllib, donc ici nous avonsle tuto, le quick startde la bibliothèque Requeston peut aller chercherdu contenu sur leweb avec Request, et puis si je vais
00:59:39 :dans la doc, probablementici si je vais dans références APIj'ai tout un chapitre sur les exceptionsici vous voyezdonc j'ai une Request exceptionet puis ensuite j'ai uneConnectionError, HTTPError,urlRequired, etc...
00:59:55 :vous avez pas mald'erreurs qui sont liéesau réseau etcette bibliothèque va typiquementutiliser donc ses propresexceptions, elle va pas utiliserpar exemple les exceptionsde urllib et doncvous allez pas retrouver au sein de la bibliothèqueRequest par exemple uneurllib.error
01:00:17 :.urlErrorici c'est deserreurs pour urllibok, donc même chosesi vous faites votre propre bibliothèquene vous préoccupez pas uniquementdes paramètresque peuvent accepter, soit les fonctionsmais également les méthodes des classesque vous avez, etles valeurs retournées, enfinles types retournés parvotre fonction, ici c'est des chaînes
01:00:43 :de caractère, mais égalementles exceptions qui vont êtrelevées par votre fonctionou votre méthode, et pour ça vous pouvezcréer des exceptions personnaliséeset ce qu'on voit c'est quecréer au plus simplecréer une exceptionpersonnalisée c'estuniquement créer une classequi hérite de exceptionset ensuite cette
01:01:07 :classe-là peut elle-même être utiliséedans un mécanisme d'héritage pourpermettre une logique decapture qui va être différentesi je capture ça, je vaiscapturer les trois autres en même tempstandis que si je capture çaje capturerais uniquement ça, doncuniquement l'exception spécifiqueet doncvous pouvez dans vos fonctions
01:01:29 :dans vos petits projets, imaginerdes hiérarchies d'exceptionsqui faciliterontla vie de l'utilisateurde vos fonctions, même si c'estvous l'utilisateur de vos fonctions, dites-voustoujourstravailler l'interface d'une fonctionça permet àvotre vous, dans six moisde vous souvenir comment fonctionneou comment travaille cette fonctionet vous pouvez
01:01:55 :documenter ces fonctions de manièreexhaustive, que ce soitdes fonctions ou des méthodes d'ailleurs, avec unedescription, en écrivantchaque argument qui est attendu dans lafonction, en documentant lavaleur retournée etéventuellement les exceptions quiseront retournées. N'oubliez pas que vous
01:02:13 :pouvez peut-être ajouter des type intmais que les type intici, ne sont pasen substitut à la documentationdonc icic'est clair que je peux éventuellementéviter de dire d'être redondantdonc ici je peux éviter de direque je retourne une chaîne de caractère puisqu'onprécise ici et je peux éviter de dire
01:02:33 :que url est une chaîne de caractèrepuisque je le précise en typepar contre une docstringva préciser égalementexactement le rôle jouépar votre paramètredonc en typeint, une annotationde type n'est pasen substitutàc'est pas non plus en substitut aux vérificationsque vous pouvez faire
01:02:59 :parce qu'il n'y a rien de contraignant derrièreune annotation de type, il n'y a rienqui empêche ici d'appelercette fonction avec une urlqui serait non ou qui seraitendonc ne pensez pasque les annotations de type sontdes protections. Et puis
01:03:17 :par contreles exceptionselles vont devoir être utiliséesen plus, ça fait partie intégrantede ce que j'appelle l'interfaced'une fonctionl'interface de programmation d'une fonctionsachant quelles sont les exceptions qui pourront êtrelevées par une fonctionje sais que quand j'utilise cette fonctionpotentiellement je peux avoirà gérer ces situations
01:03:41 :et quand j'utilise une fonction downloadweb page, je sais probablementque je vais devoirgérer la situation où je n'aipas de réseau ou alors où je récupèrele code d'une pageweb qui serait mal forméeVoilàpour ce que je voulais dire aujourd'huiet pour comment utiliserles exceptions personnalisées
01:04:03 :quand est-ce queje dois laisser à la fonctionappelante le soin de gérerces exceptionsou quand est-ce que je dois les gérer à l'intérieuron a vu quand on gèreles exceptions au plus prochedu code qui la génèreça va simplifier la suite du codemais ce code là va perdre en flexibilité
01:04:23 :à vous donc de peserle pour et le contre à chaque foisde quand est-ce quevous gérez cette exceptionmais plutôt le plus prochede l'endroit où cette exceptionest levéele plus simple sera votre codepar la suiteEst-ce que vous avez des questionssur les exceptions ?
01:04:45 :Non c'est très clair, merciJe vais arrêter laprésentation pour vous voirOk doncdéjà cette foisj'ai progressé par rapport à la dernière foisj'ai pas oublié la vidéodonc si vous deviez revenirsur cette thématiquesur la vidéo où vous aurez l'enregistrementdans les enregistrementsde docstring, donc à l'endroit habituel
01:05:15 :où vous trouvez les enregistrements des mentoratsla prochaine foisqu'on se verraJ'avais prévu de faireune session pour discuterdes questions ouvertesde toutes vos questions sur la POdonc ici n'hésitez pasà regarder l'agendapour la suiteVoilà22h06donc une petite heure ensembleet puis moi il ne me reste plus qu'à vous souhaiter
Aucune occurrence trouvée pour « ».