Hoe uitzonderingen in Python te behandelen

Het komt vaak voor dat fouten optreden tijdens de uitvoering van een programma. Twee veel voorkomende soorten fouten waarmee u te maken kunt krijgen, zijn syntaxisfouten en uitzonderingen. Syntaxisfouten treden op als u de code verkeerd typt. In dergelijke gevallen wordt de foutieve regel herhaald door de parser met een pijl die naar de vroegste locatie wijst waar de fout is gedetecteerd.

Uitzonderingen zijn verschillend van syntaxisfouten. Ze komen voor tijdens de uitvoering van een programma wanneer er iets onverwachts gebeurt. Stel dat u de gebruiker bijvoorbeeld vraagt ​​een nummer in te voeren om een ​​indeling uit te voeren. Als de gebruiker nu een reeks invoert in plaats van een cijfer en u probeert een getal te delen door de gegeven invoer, zal het programma een Typefout

Wanneer u uitzonderingen niet correct afgehandelt, wordt het programma abrupt afgesloten omdat het in dergelijke gevallen niet weet wat te doen. De volgende code is zo'n voorbeeld:

keep_asking = Waar terwijl keep_asking: x = int (invoer ("Voer een nummer in:")) print ("Dividing 50 by", x, "geeft je:", 50 / x)

Zolang u een integrale ingangswaarde invoert, zal het programma correct werken. Zodra u echter een tekenreeks of zelfs een decimaal getal als invoer invoert, krijgt u een ValueError uitzondering.

In deze zelfstudie leert u hoe u uitzonderingen in Python op de juiste manier afhandelt en opvraagt.

Enkele veelvoorkomende uitzonderingen

Hier zijn enkele basisuitzonderingen die u kunt tegenkomen bij het schrijven van programma's. U kunt meer lezen over veel meer ingebouwde uitzonderingen op de officiële website.

  • NameError: Deze uitzondering treedt op wanneer het programma geen lokale of globale naam kan vinden. De naam die niet kon worden gevonden, is opgenomen in het foutbericht.
  • Typefout: Deze uitzondering wordt verhoogd wanneer een functie een object van het ongepaste type als argument doorgeeft. Meer details over het verkeerde type worden gegeven in het foutbericht.
  • ValueError: Deze uitzondering treedt op wanneer een functieargument het juiste type maar een ongepaste waarde heeft. 
  • NotImplementedError: Deze uitzondering treedt op wanneer een object een bewerking moet ondersteunen, maar het is nog niet geïmplementeerd. Gebruik deze fout niet als de gegeven functie niet is bedoeld om het type invoerargument te ondersteunen. In die situaties, het verhogen van een Typefout uitzondering is meer geschikt.
  • ZeroDivisionError: Deze uitzondering wordt gegeven wanneer u het tweede argument voor een divisie- of modulo-bewerking als nul opgeeft.
  • FileNotFoundError: Deze uitzondering treedt op wanneer het bestand of de map waarvoor het aangevraagde programma bestaat niet bestaat.

Net als de bovenstaande namen hebben de meeste uitzonderingen een duidelijke naam.

Omgaan met een uitzondering

De code aan het begin van het artikel vroeg gebruikers om een ​​integer getal in te voeren als invoer. Als de gebruiker geen invoer met geheel getal heeft opgegeven, is het programma gestopt met uitvoeren en is er een waardefoutuitzondering opgetreden. In deze sectie zullen we een code schrijven om de gebruiker te vertellen dat zijn invoer geen geldige gehele waarde is.

De eerste stap van het proces is om de code op te nemen waarvan u denkt dat deze een uitzondering binnen de proberen clausule. De volgende stap is om de behalve sleutelwoord om de uitzondering te behandelen die in de bovengenoemde code voorkwam. De gewijzigde code voor de gebruikersinvoer ziet er als volgt uit:

keep_asking = Waar terwijl keep_asking: probeer: x = int (input ("Voer een nummer in:")) print ("Dividing 50 by", x, "geeft je:", 50 / x) behalve ValueError: print (" De invoer was geen geheel getal. Probeer het opnieuw ... ")

Wat hier gebeurt, is dat het programma de code probeert uit te voeren binnen de proberen clausule. Als er geen uitzondering is gemaakt, slaat het programma de behalve clausule en de rest van de code wordt normaal uitgevoerd. Als er een uitzondering wordt vermeld, slaat het programma de resterende code binnen de proberen clausule en het type van de uitzondering is gekoppeld aan de naam van de uitzondering na de behalve trefwoord. In het geval van een match, de code in de behalve clausule eerst wordt uitgevoerd, en vervolgens de rest van de code na de proberen clausule wordt normaal uitgevoerd.

Wanneer u een integer als invoer invoert, geeft het programma u het eindresultaat van de deling. Wanneer een niet-integrale waarde wordt opgegeven, drukt het programma een bericht af met de vraag om opnieuw een geheel getal in te voeren. Merk op dat dit keer het programma niet abrupt stopt als u een aantal ongeldige invoer levert.

Je kunt meerdere hebben behalve clausules om verschillende uitzonderingen te behandelen. Houd er rekening mee dat deze handlers alleen uitzonderingen behandelen die in het overeenkomstige voorkomen proberen clausule. Ze zullen geen uitzonderingen behandelen die zijn opgeworpen binnen andere uitzonderingshandlers.

Je kunt ook meerdere uitzonderingen afhandelen met een single behalve clausule door deze uitzonderingen op de clausule over te tuple.

behalve (ZeroDivisionError, ValueError, TypeError): print ("Er is iets misgegaan ...") # code om de uitzondering aan te pakken

Ten slotte kunt u ook de naam van de uitzondering weglaten na de behalve trefwoord. Dit wordt over het algemeen niet aanbevolen omdat de code nu alle uitzonderingen ophaalt en op dezelfde manier verwerkt. Dit is niet optimaal omdat u een a Typefout uitzondering op dezelfde manier als u zou hebben behandeld a ZeroDivisionError uitzondering. Bij het omgaan met uitzonderingen is het beter om zo specifiek mogelijk te zijn en alleen te vangen wat u aankan.

Een mogelijk gebruik van het vangen van alle uitzonderingen is het correct afdrukken van de uitzonderingsfout op het scherm, zoals de volgende code:

importeer math import sys try: result = math.factorial (2.4) behalve: print ("Something Unexpected has happened is done.", sys.exc_info () [0]) else: print ("The factial is", result)

De andere clausule gebruiken

U kunt ook een anders clausule in a probeer ... behalve uitspraak. De anders clausule is bedoeld om code te bevatten die moet worden uitgevoerd als de proberen clausule heeft geen uitzonderingen opgeleverd. Dit kan handig zijn om ervoor te zorgen dat u geen code toevoegt aan de proberen blok waarvan je de uitzonderingen niet wilt vangen. Een ding dat het vermelden waard is, is dat als u besluit om een anders clausule, zou u het na alle moeten opnemen behalve clausules maar vóór de Tenslotte blok.

In ons geval zouden we de regel kunnen verplaatsen die het resultaat van onze splitsing in de anders blok.

keep_asking = Waar terwijl keep_asking: probeer: x = int (input ("Voer een nummer in:")) behalve ValueError: print ("De invoer was geen geldig geheel getal. Probeer het nog een keer ...") else: print ("Dividing 50 met ", x," geeft u: ", 50 / x)

Opruimen met de slotclausule

Laten we zeggen dat je wat code hebt geschreven in de proberen blok dat geacht wordt een taak uit te voeren door een grote hoeveelheid middelen te gebruiken. Het is belangrijk om die bronnen vrij te geven als u klaar bent met het gebruik ervan. Dit kan eenvoudig worden bereikt door de Tenslotte clausule. 

De code in de Tenslotte clausule wordt altijd uitgevoerd ongeacht of het proberen blok verhoogd een uitzondering. U kunt dit verifiëren door de volgende code uit te voeren:

keep_asking = Waar terwijl keep_asking: probeer: x = int (input ("Voer een nummer in:")) behalve ValueError: print ("De invoer was geen geldig geheel getal. Probeer het nog een keer ...") else: print ("Dividing 50 met ", x," geeft u: ", 50 / x) eindelijk: print (" Heeft al het nodige gedaan. ")

Als een van de behalve clausules die u hebt opgegeven, gaan niet in op de verhoogde uitzondering, dezelfde uitzondering wordt opnieuw verhoogd na het uitvoeren van de code in de Tenslotte blok.

Een meer complex voorbeeld

In deze sectie zullen we een programma schrijven om met meerdere uitzonderingen om te gaan. Net als de voorgaande voorbeelden zullen we enkele wiskundige bewerkingen uitvoeren. Deze keer nemen we de invoer uit een lijst.

De volgende code controleert voor twee uitzonderingen, Typefout en ValueError. De anders blok wordt gebruikt om de faculteit af te drukken. U kunt in de uitvoer zien dat deze code alleen wordt uitgevoerd als er geen uitzondering wordt gemaakt.

import math number_list = [10, -5,1.2, 'apple'] voor nummer in number_list: try: number_factorial = math.factorial (number) except TypeError: print ("Factorial wordt niet ondersteund voor opgegeven invoertype.") behalve ValueError : print ("Factorial accepteert alleen positieve gehele waarden.", getal, "is geen positief geheel getal") else: print ("De faculteit van", nummer, "is", number_factorial) eindelijk: print ("Laat alle bronnen vrij in gebruik.")

De bovenstaande code produceert de volgende uitvoer:

De faculteit van 10 is 3628800 Vrijgeven van gebruikte hulpmiddelen. Factorial accepteert alleen positieve gehele waarden. -5 is geen positief geheel getal. Alle gebruikte hulpbronnen vrijgeven. Factorial accepteert alleen positieve gehele waarden. 1.2 is geen positief geheel getal. Alle gebruikte hulpbronnen vrijgeven. Factorial wordt niet ondersteund voor gegeven invoertype. Alle gebruikte hulpbronnen vrijgeven.

Een ander ding dat het vermelden waard is, is dat de code in de Tenslotte clausule wordt uitgevoerd voor elk item in de lijst.

Laatste gedachten

Ik hoop dat deze tutorial je heeft geholpen om de afhandeling van uitzonderingen in Python te begrijpen. Aarzel niet om te zien wat we te koop aanbieden en om te studeren op de markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.

Juiste afhandeling van uitzonderingen kan zeer nuttig zijn in situaties waarin het verlaten van een programma nadat het een onverwachte invoer ontvangt niet haalbaar is. Als u vragen hebt over de afhandeling van uitzonderingen in Python, kunt u me dit laten weten in de opmerkingen. 

Leer Python

Leer Python met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.