python try except python handling exception with examples
In deze tutorial wordt de behandeling van uitzonderingen in Python uitgelegd met behulp van het blok Try Behalve met behulp van programmeervoorbeelden:
Twee fouttypen kunnen ertoe leiden dat een Python-programma abrupt stopt, d.w.z. Syntaxisfouten , en Uitzonderingen In deze zelfstudie bespreken we het tweede fouttype (uitzonderingen) onder verschillende belangrijke onderwerpen.
We hebben veel baat bij het afhandelen van uitzonderingen in onze applicatie, zoals:
- Een robuuste applicatie maken.
- Creëer een schone en foutloze code.
Bezoek hier voor de exclusieve Python Training Tutorial Series
Wat je leert:
- Python Probeer behalve
- Veelvoorkomende Python-uitzonderingen
- Gevolgtrekking
Python Probeer behalve
Een goed nieuws is dat Python een groot aantal ingebouwde uitzonderingen heeft om fouten in onze code op te vangen. Het geeft ons ook de mogelijkheid om aangepaste uitzonderingen te maken wanneer geen van de ingebouwde uitzonderingen aan onze behoeften voldoet.
Wat is een uitzondering
Dus wat is een uitzondering in Python? Welnu, in eenvoudige bewoordingen, telkens wanneer de Python-interpreter ongeldige code probeert uit te voeren, genereert het een uitzondering, en in de gevallen waarin een dergelijke uitzondering niet wordt behandeld, verstoort het de normale stroom van de instructies van het programma en drukt het een traceback af.
Laten we een ongeldige code maken en kijken hoe de Python-interpreter zal reageren.
Open een Python-shell en voer de volgende code uit.
Dit is een van de meest voorkomende fouten bij het programmeren. De bovenstaande code probeert het nummer te verdelen vijftig door 0 (nul). De Python-interpreter ziet dit als een ongeldige bewerking en roept een ZeroDivisionError , verstoort het programma en drukt een traceback af.
Dat kunnen we duidelijk zien ZeroDivisionError is de uitzondering die werd opgeworpen. Het is inderdaad Pythons eigen manier om ons te vertellen dat het niet cool is om een getal door nul te delen. Hoewel dit in andere talen zoals JavaScript geen fout is; en python verbiedt deze praktijk strikt.
Het is ook belangrijk om te weten dat dit slechts een uitzonderingsobject is en dat Python veel van dergelijke objecten heeft ingebouwd. Bekijk deze Python-official documentatie om alle ingebouwde uitzonderingen van Python te zien.
Traceback begrijpen
Voordat we ingaan op het omgaan met uitzonderingen, denk ik dat het zal helpen te begrijpen wat er precies zal gebeuren als uitzonderingen niet worden afgehandeld en hoe Python zijn best doet om ons over onze fout te informeren.
Elke keer dat Python een fout tegenkomt, wordt er een uitzondering gegenereerd. Als deze uitzondering niet wordt afgehandeld, produceert het wat informatie genaamd Traceback. Dus, welke informatie bevat deze traceback?
Het bevat:
- Het foutbericht dat ons vertelt welke uitzondering is opgetreden en wat er is gebeurd voordat deze uitzondering is opgetreden.
- De verschillende regelnummers van de code die deze fout veroorzaakten. Een fout kan worden veroorzaakt door een reeks functieaanroepen genaamd a call stack die we later hier zullen bespreken.
Hoewel het een beetje verwarrend is, beloven we dat het volgende voorbeeld meer licht zal brengen in ons begrip.
Herinner je de traceback die werd afgedrukt door 50 te delen door 0 hierboven, we kunnen zien dat de traceback de volgende informatie bevat:
- Bestand '': dit vertelt ons dat deze code werd uitgevoerd vanaf een console-terminal.
- regel 1: Dit vertelt ons dat de fout is opgetreden in dit regelnummer.
- ZeroDivision-fout: deling door nul: Het vertelt ons welke uitzondering er is gemaakt en waardoor deze is veroorzaakt.
Laten we een ander voorbeeld proberen en misschien kijken hoe een call stack lijkt op. Open een editor, voer de onderstaande code in en sla op als tracebackExp .py
Open een terminal in de directory waarin dit bestand is gevonden en voer het uit.
U ziet de volgende traceback:
De bovenstaande traceback lijkt misschien verwarrend, maar dat is het niet. Pythonistas heeft de beste manier bedacht om traceback te lezen, namelijk van de onderkant boven Laten we deze wijsheid dus gebruiken om te proberen te begrijpen wat deze traceback te bieden heeft.
- Helemaal onderaan krijgen we de uitzondering die is opgetreden en waarom deze is opgetreden.
- Als we naar boven gaan, krijgen we de bestandsnaam tracebackExp .py waar deze fout optrad, de berekening die deze fout veroorzaakte compute = numb / div, de functiestapel2 en de linknummerregel 6 waar deze berekening werd uitgevoerd.
- Als we naar boven gaan, zien we dat onze stack2-functie werd aangeroepen in de functie stack1 in regel nummer 3.
- Als we naar het bovenste gaan, zien we dat de functie stack1 werd aangeroepen in regel nummer 11.< module > vertelt ons dat het het bestand is dat wordt uitgevoerd.
Veelvoorkomende Python-uitzonderingen
De Python-bibliotheek definieert ontzettend veel ingebouwde uitzonderingen. U kunt de Python-documentatie controleren of het ingebouwde lokaal () functie zoals hieronder:
We zullen niet proberen al deze uitzonderingen aan te pakken, maar we zullen een paar veelvoorkomende uitzonderingen zien die u waarschijnlijk zult tegenkomen.
# 1) TypeError
Het wordt verhoogd wanneer een bewerking of functie wordt toegepast op een object van een ongepast type.
voorbeeld 1
Beschouw het onderstaande programma. Het neemt een dividend en een deler op, berekent en drukt vervolgens het resultaat af van het delen van het dividend door de deler.
We vragen de waarde van het deeltal en de deler van de gebruiker, maar we vergeten de tekenreekswaarde van de deler in een geheel getal te gieten. We eindigen dus met het type dividend als geheel getal ( int ) en het type van de deler is string ( p We krijgen dan de Typefout aangezien de divisie-operator (/) niet werkt op strings.
Het is misschien interessant om te weten dat Javascript, in tegenstelling tot Python, Type Coercion heeft dat in feite een van de typen operand converteert naar een equivalente waarde van het type van de andere operand als de operanden van verschillende typen zijn.
# 2) ValueError
Dit wordt veroorzaakt wanneer een bewerking of functie een argument ontvangt van het juiste type maar een ongepaste waarde.
Voorbeeld 2
Beschouw ons programma in voorbeeld 1 bovenstaand.
Als de gebruiker een alfanumerieke waarde voor het dividend invoert, zoals ‘3a’, dan zal ons programma de uitzondering ValueError verhogen. Dit komt omdat, hoewel Python int () methode neemt een willekeurig getal of tekenreeks op en retourneert een geheel getal-object, de tekenreekswaarde mag geen letters of een niet-numerieke waarde bevatten.
# 3) AttributeError
Deze uitzondering wordt gegenereerd bij het toewijzen van of verwijzen naar een kenmerk dat niet bestaat.
Voorbeeld 3
Beschouw het onderstaande programma. Het neemt een getal op en berekent de vierkantswortel met behulp van de Python wiskundige module
Wanneer een gebruiker een getal invoert, probeert ons programma een functie uit de wiskundige module te gebruiken om de vierkantswortel te berekenen, maar hier hebben we een fout gemaakt. In plaats van sqrt hebben we per ongeluk sqr getypt die niet bestaat in de wiskundige module.
We probeerden dus te verwijzen naar een attribuut sqr dat niet bestaat en hebben geleid tot de uitzondering AttributeError. De meesten van ons maken vaak dit soort fouten. Je bent dus niet de enige.
Uitzonderingen afhandelen met Try Behalve
Als programmeur zullen de meesten van ons onze tijd besteden aan het schrijven van een robuuste code die veerkrachtig is. Code die niet kapot gaat vanwege een aantal fouten. In Python kunnen we dit bereiken door onze uitspraken in een proberen behalve uitspraak.
Python Try-Behalve-instructie
De instructie try-except heeft de volgende structuur:
Laten we de code tussen plaatsen tracebackExp .py in een try-behalve-statement.
Als u deze code uitvoert, wordt de uitvoer geproduceerd
Dit is hoe de try-except-instructie werkt. Python voert de code uit in het try-blok lijn 7-8 Als er geen ongeldige code wordt gevonden, wordt de code in het blok uitgezonderd lijn 10 wordt overgeslagen en de uitvoering gaat door.
Maar als een ongeldige code wordt gevonden, stopt de uitvoering onmiddellijk in het try-blok en wordt gecontroleerd of de opgewekte uitzondering overeenkomt met de uitzondering die we hebben opgegeven in de except-instructie lijn 9 Als het overeenkomt, wordt het behalve blok uitgevoerd en gaat het verder. Als dit niet het geval is, wordt het programma onderbroken.
Het try-blok bevat meestal de code die een uitzondering kan veroorzaken, terwijl het except-blok de uitzondering opvangt en afhandelt.
Omgaan met meerdere uitzonderingen met uitzondering
We kunnen meerdere uitzonderingen behandelen met een enkele 'behalve' of meerdere 'uitzonderingen'. Het hangt allemaal af van hoe u met elke uitzondering wilt omgaan.
# 1) Meerdere uitzonderingen behandelen met een enkele uitzondering
Deze methode wordt gebruikt wanneer we vermoeden dat onze code verschillende uitzonderingen kan opleveren en we in elk geval dezelfde actie willen ondernemen. Dus als de Python-interpreter een overeenkomst vindt, wordt de code die in het except-blok is geschreven, uitgevoerd.
Laten we eens kijken naar het onderstaande voorbeeld van Python-code
We hebben twee mogelijke uitzonderingen die hier aan de orde kunnen worden gesteld, ZeroDivisionError en IndexFout Als een van deze uitzonderingen wordt gemeld, wordt het blok met uitzondering uitgevoerd.
In de bovenstaande code idx = 3, dus idx_ waarde wordt 0 en waarde / idx_ waarde zal ZeroDivisionError oproepen
# 2) Meerdere uitzonderingen behandelen met meerdere uitzonderingen
Als we liever elke uitzondering afzonderlijk willen behandelen, dan is dit hoe u het kunt doen.
Beschouw het onderstaande voorbeeld Python-code
We merken hier dat Exception werd gebruikt in de laatste except-instructie. Dit komt doordat het uitzonderingsobject Uitzondering overeenkomt met elke uitzondering. Om deze reden zou het altijd de laatste moeten zijn, aangezien Python stopt met het controleren van andere exception-handlers zodra er een overeenkomt.
In de bovenstaande code, idx = 5 , Vandaar arr (idx) zal stijgen IndexFout omdat idx is groter dan de lengte van de lijst arr
Ook als u niet zeker weet welke uitzondering door uw toepassing is veroorzaakt, is het nooit veilig om door te gaan met de uitvoering. Daarom hebben we het type Exception om eventuele onvoorspelbare uitzonderingen op te vangen. Vervolgens informeren we de gebruiker en onderbreken we de toepassing door dezelfde uitzondering op te werpen.
Probeer een andere verklaring
Dit is een optionele functie van het afhandelen van uitzonderingen en stelt u in staat code toe te voegen die u wilt uitvoeren wanneer er geen fouten zijn opgetreden. Als er een fout optreedt, wordt dit else-blok niet uitgevoerd.
Beschouw het onderstaande voorbeeld van de Python-code, open je editor en sla de code op zoals elseTry.py
We krijgen input van de gebruiker en gebruiken deze om 1 te delen. We hebben hier twee mogelijke uitzonderingen, een ongeldige gebruikersinvoer die ervoor zorgt dat ValueError en een nul (0) wat zal veroorzaken ZeroDivisionError Onze uitzonderingsverklaring behandelt deze fouten.
Nu willen we de waarde afdrukken van waarde Ons else-blok zorgt ervoor dat het alleen wordt afgedrukt als ons try-blok foutloos wordt uitgevoerd. Dit is belangrijk omdat als er een fout optreedt in ons try-block, de waarde zal ongedefinieerd zijn. Dus als u er toegang toe krijgt, zal er nog een fout optreden.
Voer de bovenstaande code uit met Python elseTry.py
De uitvoer hierboven laat zien dat we voor de eerste invoer hebben getypt 0 en drukte op ENTER. Omdat onze deler 0 heeft gekregen, 1 / deler verhoogd zeroDivisionError Onze tweede invoer was k die ongeldig is voor int (), vandaar de uitzondering ValueError wordt verhoogd.
Maar onze laatste invoer was 9, wat geldig is en als resultaat kregen we de waarde van ' waarde ”Afgedrukt als 0.1111111111111111
Probeer eindelijk verklaring
Dit is ook een optionele functie van exception handling en zal altijd draaien, wat er ook gebeurt in de exception handlers.
Dat is:
- Of er al dan niet een uitzondering optreedt
- Zelfs als er in de andere blokken een ‘return’ wordt aangeroepen.
- Zelfs als het script in de andere blokken wordt afgesloten
Dus als we een code hebben die we in alle situaties willen uitvoeren, is eindelijk-block onze man. Dit blok wordt meestal gebruikt voor opruimacties zoals het sluiten van bestanden.
Beschouw het onderstaande voorbeeld Python-code
Deze code probeert het bestand text.txt in zijn huidige directory te openen en te lezen. Als het bestand bestaat, drukt ons programma de eerste regel van het bestand af, waarna ons final-blok wordt uitgevoerd en het bestand wordt gesloten.
Stel dat we een bestand met de naam text.txt hebben in de directory waar dit programmabestand is en Hello bevat. Als we het programma uitvoeren, hebben we de uitvoer
Dit voorbeeld is met opzet gekozen omdat ik wilde dat we een klein probleem aanpakken dat kan optreden bij het sluiten van bestanden in het slotblok.
Als het bestand niet bestaat, is de uitzondering FileNotFoundError wordt verhoogd en de variabele open bestand wordt niet gedefinieerd en is geen bestandsobject. Daarom zal het proberen om het in het slotblok te sluiten een uitzondering opleveren UnboundLocalError dat is een subklasse van NaamFout
Dit zegt in feite dat we proberen te verwijzen naar de variabele open bestand voordat het is toegewezen.
Een kleine truc hier is om exception handlers te gebruiken in het final-block.
Als ons try-block FileNotFoundError oproept, dan hebben we de volgende output
Uitzondering verhogen
Een goed nieuws over uitzonderingen voor Python is dat we ze opzettelijk kunnen verhogen. Uitzonderingen worden gemaakt met de verklaring opstellen
De instructie raise heeft de volgende syntaxis:
Open een terminal en gebruik een exception-object uit het Python ingebouwde uitzonderingen. Bijvoorbeeld, als we ZeroDivisionError verhogen:
We krijgen de traceback:
Dus waarom is het belangrijk om uitzonderingen aan de orde te stellen?
- Bij het werken met aangepaste uitzonderingen.
- Tijdens geestelijke controles.
Aangepaste uitzonderingsklassen
Een aangepaste uitzondering is een uitzondering die u maakt om fouten af te handelen die specifiek voor u zijn. De truc is dat we een klasse definiëren die is afgeleid van het object Uitzondering , dan gebruiken we de instructie raise om onze exception class te verhogen.
Stel dat we de gebruikersinvoer willen controleren en ervoor zorgen dat de invoerwaarde niet negatief is (sanity check). Natuurlijk kunnen we de Python-uitzondering ValueError verhogen, maar we willen de fout aanpassen door deze een specifieke en voor zichzelf sprekende naam te geven, zoals InputIsNegativeError Maar deze uitzondering is geen ingebouwde uitzondering van Python.
Dus eerst maken we onze basisklasse die zal worden afgeleid van Exception.
Vervolgens maken we onze uitzonderingsklasse die de basisklasse zal erven en onze specifieke fout zal afhandelen.
Laten we dit eens testen
De bovenstaande code vraagt om gebruikersinvoer en controleer of deze negatief is. Als het waar is, wordt onze aangepaste uitzondering InputIsNegativeError gegenereerd, die later wordt opgevangen in de except-statement.
Hieronder staat de volledige code:
Als de invoerwaarde een negatief getal is, zoals -1, dan hebben we de uitvoer:
converteer youtube naar mp3 langer dan 20 minuten
Bekijk de Python doc voor meer informatie over aangepaste uitzonderingen voor Python.
Veel Gestelde Vragen
V # 1) Hoe behandelt Python een uitzondering?
Antwoord: Python verwerkt uitzonderingen met behulp van de probeer-behalve-instructie De code die een uitzondering kan veroorzaken, wordt geplaatst en uitgevoerd in het probeer blok Terwijl de behalve blok bevat de code die de uitzonderingen zal behandelen als die zich voordoen.
Vraag 2) Wat is het genereren van een uitzondering in Python?
Antwoord: Elke keer dat de Python-interpreter een ongeldige code tegenkomt, wordt er een uitzondering gegenereerd, wat Pythons eigen manier is om ons te vertellen dat er iets onverwachts is gebeurd. We kunnen ook opzettelijk uitzonderingen maken met behulp van de verklaring opstellen
V # 3) Hoe gaat Python om met meerdere uitzonderingen?
Antwoord: Python verwerkt meerdere uitzonderingen met behulp van een enkel behalve blok of meerdere behalve blokken.
Voor een enkel blok worden de uitzonderingen als een tupel doorgegeven: behalve (Exception1, Exception2, .., ExceptionN) en Python controleert op een overeenkomst van rechts naar links. In dat geval wordt voor elke uitzondering dezelfde actie ondernomen.
Een andere manier om alle uitzonderingen op te vangen, is door de naam van de uitzondering achter het trefwoord except weg te laten.
De tweede manier is om voor elke uitzondering een behalve blok te gebruiken:
Op deze manier kunt u voor elke uitzondering afzonderlijke acties ondernemen.
V # 4) Waarom is het afhandelen van uitzonderingen belangrijk in Python?
Antwoord: Het voordeel van het afhandelen van uitzonderingen in Python is dat we robuuste, schone en foutloze applicaties kunnen maken. We willen niet dat onze productiecode crasht als gevolg van een aantal fouten, dus we lossen de fouten op en houden onze applicatie actief.
V # 5) Hoe negeer je een uitzondering in Python?
Antwoord: Om een uitzondering in Python te negeren, gebruikt u de slagen voor trefwoord in het behalve blok. Laten we zeggen dat we de ValueError-uitzondering willen negeren. We zullen het op deze manier doen:
Tenzij u weet wat u doet, is het een slechte gewoonte om uitzonderingen te negeren. Informeer de gebruiker tenminste over alle mogelijke fouten.
Gevolgtrekking
In deze tutorial hebben we het volgende behandeld: Python-uitzonderingen, Traceback; hoe om te gaan met uitzonderingen Proberen Behalve Anders Tenslotte blokken, hoe Verhogen Uitzonderingen, en tot slot hoe u onze eigen aangepaste uitzonderingen kunt maken.
Bedankt voor het lezen!
Bezoek hier om Python vanaf het begin te leren.
Aanbevolen literatuur
- Python-zelfstudie voor beginners (hands-on GRATIS Python-training)
- Python-besturingsverklaringen (Python Continue, Break en Pass)
- Python DateTime-zelfstudie met voorbeelden
- Python String-functies
- Python-variabelen
- C # Tutorial voor het afhandelen van uitzonderingen met codevoorbeelden
- Volledige gids voor het omgaan met PL SQL-uitzonderingen met voorbeelden
- Java-uitzonderingen en het afhandelen van uitzonderingen met voorbeelden