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.
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.
Typefout
uitzondering is meer geschikt.Net als de bovenstaande namen hebben de meeste uitzonderingen een duidelijke naam.
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)
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)
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.
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.
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 met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.