In deze zelfstudie leert u hoe u met uitzonderingen in uw Python-programma omgaat met de beweringen try, behalve en tenslotte met behulp van voorbeelden.
Video: Afhandeling van Python-uitzonderingen (probeer … behalve … eindelijk)
Uitzonderingen in Python
Python heeft veel ingebouwde uitzonderingen die worden veroorzaakt wanneer uw programma een fout tegenkomt (er gaat iets mis in het programma).
Als deze uitzonderingen zich voordoen, stopt de Python-interpreter het huidige proces en geeft het door aan het aanroepproces totdat het is afgehandeld. Als het niet wordt afgehandeld, loopt het programma vast.
Laten we bijvoorbeeld eens kijken naar een programma waarin we een functie hebben die een functie A
aanroept B
, die op zijn beurt een functie aanroept C
. Als er een uitzondering optreedt in de functie C
maar niet wordt afgehandeld C
, wordt de uitzondering doorgegeven aan B
en vervolgens aan A
.
Als dit nooit wordt afgehandeld, wordt er een foutmelding weergegeven en komt ons programma plotseling onverwacht tot stilstand.
Uitzonderingen opvangen in Python
In Python kunnen uitzonderingen worden afgehandeld met behulp van een try
instructie.
De kritieke bewerking die een uitzondering kan veroorzaken, wordt in de try
clausule geplaatst. De code die de uitzonderingen afhandelt, staat in de except
clausule.
We kunnen dus kiezen welke bewerkingen we 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
De inzending is een Oeps! heeft plaatsgevonden. Volgende invoer. De invoer is 0 Oeps! opgetreden. Volgende invoer. De invoer is 2 Het omgekeerde van 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 het try
blok geplaatst.
Als er geen uitzondering optreedt, wordt het except
blok overgeslagen en gaat de normale stroom door (voor de laatste waarde). Maar als er een uitzondering optreedt, wordt deze opgevangen door het except
blok (eerste en tweede waarden).
Hier drukken we de naam van de uitzondering af met behulp van de exc_info()
functie in de sys
module. We kunnen die a
oorzaken ValueError
en 0
oorzaken zien ZeroDivisionError
.
Omdat elke uitzondering in Python erft van de basisklasse Exception
, 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 in Python opvangen
In het bovenstaande voorbeeld hebben we geen specifieke uitzondering in de except
clausule genoemd.
Dit is geen goede programmeerpraktijk, aangezien alle uitzonderingen worden opgevangen en elke case op dezelfde manier wordt behandeld. We kunnen specificeren welke uitzonderingen een except
clausule moet opvangen.
Een try
clausule kan een willekeurig aantal except
clausules hebben om verschillende uitzonderingen af te handelen, maar er wordt er maar één uitgevoerd in het geval er zich een uitzondering voordoet.
We kunnen een tupel waarden gebruiken om meerdere uitzonderingen in een exceptieclausule op te geven. Hier is een voorbeeld van een pseudocode.
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 maken in Python
In Python-programmering worden uitzonderingen gemaakt wanneer fouten optreden tijdens runtime. We kunnen ook handmatig uitzonderingen instellen met behulp van het raise
trefwoord.
We kunnen optioneel waarden doorgeven aan de uitzondering om te verduidelijken waarom die uitzondering is opgetreden.
>>> 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 probeer met else-clausule
In sommige situaties wilt u misschien een bepaald codeblok uitvoeren als het codeblok binnenin try
zonder fouten is uitgevoerd. Voor deze gevallen kunt u het optionele else
trefwoord gebruiken bij de try
verklaring.
Opmerking : uitzonderingen in de else-clausule worden niet afgehandeld door de voorgaande except-clausules.
Laten we naar een voorbeeld kijken:
# 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 passeren:
Voer een getal in: 1 Geen even getal!
Als we een even getal doorgeven, wordt het omgekeerde berekend en weergegeven.
Voer een getal in: 4 0,25
Als we echter 0 passeren, krijgen we ZeroDivisionError
omdat het codeblok binnenin else
niet wordt afgehandeld door voorafgaande except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
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.