Afhandeling van Python-uitzonderingen met behulp van de instructie try, behalve en tenslotte
Afhandeling van Python-uitzonderingen met behulp van de instructie try, behalve en ten slotte
In deze tutorial leer je met behulp van voorbeelden om te gaan met uitzonderingen in je Python-programma met behulp van try, behalve en tenslotte statements.
Video:Afhandeling van Python-uitzonderingen (probeer..behalve..eindelijk)
Uitzonderingen in Python
Python heeft veel ingebouwde uitzonderingen die worden gegenereerd wanneer je programma een fout tegenkomt (er gaat iets mis in het programma).
Wanneer deze uitzonderingen optreden, stopt de Python-interpreter het huidige proces en geeft het door aan het aanroepende proces totdat het wordt afgehandeld. Als het niet wordt afgehandeld, zal het programma crashen.
Laten we bijvoorbeeld een programma beschouwen waarin we een functie hebben A
die functie B
. aanroept , die op zijn beurt functie C
. aanroept . Als er een uitzondering optreedt in functie C
maar wordt niet afgehandeld in C
, de uitzondering gaat naar B
en dan naar A
.
Als het niet wordt afgehandeld, wordt een foutmelding weergegeven en komt ons programma plotseling onverwacht tot stilstand.
Uitzonderingen opvangen in Python
In Python kunnen uitzonderingen worden afgehandeld met een try
verklaring.
De kritieke bewerking die een uitzondering kan veroorzaken, wordt in de try
. geplaatst clausule. De code die de uitzonderingen afhandelt, is geschreven in de except
clausule.
We kunnen dus kiezen welke bewerkingen we moeten uitvoeren zodra we de uitzondering hebben opgevangen. Hier is een eenvoudig voorbeeld.
# import module sys to get the type of exception
import sys
randomList = ['a', 0, 2]
for entry in randomList:
try:
print("The entry is", entry)
r = 1/int(entry)
break
except:
print("Oops!", sys.exc_info()[0], "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
Uitvoer
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occured. Next entry. The entry is 2 The reciprocal of 2 is 0.5
In dit programma doorlopen we de waarden van de randomList lijst. Zoals eerder vermeld, wordt het gedeelte dat een uitzondering kan veroorzaken in de try
. geplaatst blok.
Als er geen uitzondering optreedt, wordt de except
blok wordt overgeslagen en de normale stroom gaat door (voor de laatste waarde). Maar als er een uitzondering optreedt, wordt deze opgevangen door de except
blok (eerste en tweede waarde).
Hier drukken we de naam van de uitzondering af met de exc_info()
functie binnen sys
module. We kunnen zien dat a
veroorzaakt ValueError
en 0
veroorzaakt ZeroDivisionError
.
Aangezien elke uitzondering in Python erft van de basis Exception
klasse, kunnen we de bovenstaande taak ook op de volgende manier uitvoeren:
# import module sys to get the type of exception
import sys
randomList = ['a', 0, 2]
for entry in randomList:
try:
print("The entry is", entry)
r = 1/int(entry)
break
except Exception as e:
print("Oops!", e.__class__, "occurred.")
print("Next entry.")
print()
print("The reciprocal of", entry, "is", r)
Dit programma heeft dezelfde output als het bovenstaande programma.
Specifieke uitzonderingen opvangen in Python
In het bovenstaande voorbeeld hebben we geen specifieke uitzondering genoemd in de except
clausule.
Dit is geen goede programmeerpraktijk omdat het alle uitzonderingen opvangt en elk geval op dezelfde manier behandelt. We kunnen specificeren welke uitzonderingen een except
clausule zou moeten vangen.
Een try
clausule kan een willekeurig aantal except
. hebben clausules om verschillende uitzonderingen af te handelen, maar er wordt er maar één uitgevoerd als er een uitzondering optreedt.
We kunnen een tupel met waarden gebruiken om meerdere uitzonderingen in een uitzonderingsclausule op te geven. Hier is een voorbeeld van een pseudo-code.
try:
# do something
pass
except ValueError:
# handle ValueError exception
pass
except (TypeError, ZeroDivisionError):
# handle multiple exceptions
# TypeError and ZeroDivisionError
pass
except:
# handle all other exceptions
pass
Uitzonderingen verhogen in Python
In Python-programmering worden uitzonderingen gemaakt wanneer fouten optreden tijdens runtime. We kunnen uitzonderingen ook handmatig verhogen met de raise
zoekwoord.
We kunnen optioneel waarden doorgeven aan de uitzondering om te verduidelijken waarom die uitzondering is gemaakt.
>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt
>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument
>>> try:
... a = int(input("Enter a positive integer: "))
... if a <= 0:
... raise ValueError("That is not a positive number!")
... except ValueError as ve:
... print(ve)
...
Enter a positive integer: -2
That is not a positive number!
Python proberen met else-clausule
In sommige situaties wil je misschien een bepaald codeblok uitvoeren als het codeblok in try
liep zonder fouten. Voor deze gevallen kunt u de optionele else
. gebruiken trefwoord met de try
verklaring.
Opmerking :Uitzonderingen in de else-clausule worden niet behandeld door de voorgaande behalve-clausules.
Laten we een voorbeeld bekijken:
# program to print the reciprocal of even numbers
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1/num
print(reciprocal)
Uitvoer
Als we een oneven getal doorgeven:
Enter a number: 1 Not an even number!
Als we een even getal doorgeven, wordt het omgekeerde berekend en weergegeven.
Enter a number: 4 0.25
Als we echter 0 passeren, krijgen we ZeroDivisionError
als het codeblok in else
wordt niet afgehandeld door voorafgaande except
.
Enter a number: 0 Traceback (most recent call last): File "<string>", line 7, in <module> reciprocal = 1/num ZeroDivisionError: division by zero
Python proberen... eindelijk
De try
statement in Python kan een optionele finally
. hebben clausule. Deze clausule wordt hoe dan ook uitgevoerd en wordt over het algemeen gebruikt om externe bronnen vrij te geven.
We kunnen bijvoorbeeld via het netwerk verbonden zijn met een extern datacenter of werken met een bestand of een grafische gebruikersinterface (GUI).
In al deze omstandigheden moeten we de bron opschonen voordat het programma stopt, of het nu succesvol is uitgevoerd of niet. Deze acties (een bestand sluiten, GUI of loskoppelen van het netwerk) worden uitgevoerd in de finally
clausule om de uitvoering te garanderen.
Hier is een voorbeeld van bestandsbewerkingen om dit te illustreren.
try:
f = open("test.txt",encoding = 'utf-8')
# perform file operations
finally:
f.close()
Dit type constructie zorgt ervoor dat het bestand wordt gesloten, zelfs als er een uitzondering optreedt tijdens de uitvoering van het programma.
Python
- Python-sleutelwoorden en -ID's
- Python-verklaring, inspringing en opmerkingen
- Python-variabelen, constanten en literalen
- Python Type Conversie en Type Casting
- Python invoer, uitvoer en import
- Python pass-instructie
- Python globale, lokale en niet-lokale variabelen
- Python-directory en bestandsbeheer
- Afhandeling van Python-uitzonderingen met behulp van de instructie try, behalve en tenslotte
- Python- en Raspberry Pi-temperatuursensor
- C++ Exception Handling:Try, Catch, Throw Voorbeeld