Tässä opetusohjelmassa opit käsittelemään poikkeuksia Python-ohjelmassa käyttämällä try, paitsi ja lopuksi lauseita esimerkkien avulla.
Video: Python-poikkeusten käsittely (kokeile… paitsi… lopulta)
Poikkeukset Pythonissa
Pythonissa on monia sisäänrakennettuja poikkeuksia, jotka tulevat esiin, kun ohjelma havaitsee virheen (jotain ohjelmassa menee pieleen).
Kun näitä poikkeuksia esiintyy, Python-tulkki pysäyttää nykyisen prosessin ja siirtää sen kutsuprosessiin, kunnes sitä käsitellään. Jos sitä ei käsitellä, ohjelma kaatuu.
Tarkastellaan esimerkiksi ohjelmaa, jossa meillä on toiminto, A
joka kutsuu funktion B
, joka puolestaan kutsuu toimintoa C
. Jos toiminnossa tapahtuu poikkeus, C
mutta sitä ei käsitellä C
, poikkeus siirtyy kohtaan B
ja sitten A
.
Jos sitä ei koskaan käsitellä, näyttöön tulee virheilmoitus ja ohjelmamme äkillisesti pysähtyy.
Poikkeusten saaminen Pythonissa
Pythonissa poikkeuksia voidaan käsitellä try
käskyn avulla.
Kriittinen operaatio, joka voi aiheuttaa poikkeuksen, sijoitetaan try
lauseen sisälle . Poikkeuksia käsittelevä koodi on kirjoitettu except
lausekkeeseen.
Voimme siis valita suoritettavat toiminnot, kun olemme saaneet poikkeuksen. Tässä on yksinkertainen esimerkki.
# 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)
Tuotos
Merkintä on Hups! tapahtui. Seuraava merkintä. Merkintä on 0 Hups! tapahtui. Seuraava merkintä. Merkintä on 2. Vastakohta 2 on 0,5
Tässä ohjelmassa käymme läpi randomList-luettelon arvot. Kuten aiemmin mainittiin, osa, joka voi aiheuttaa poikkeuksen, sijoitetaan try
lohkon sisään.
Jos poikkeusta ei tapahdu, except
lohko ohitetaan ja normaali virtaus jatkuu (viimeiselle arvolle). Mutta jos jotain poikkeusta tapahtuu, except
lohko tarttuu siihen (ensimmäinen ja toinen arvo).
Tulostamme poikkeuksen nimen moduulin exc_info()
sisäisellä toiminnolla sys
. Voimme nähdä a
syyt ValueError
ja 0
syyt ZeroDivisionError
.
Koska jokainen Pythonin poikkeus periytyy perusluokasta Exception
, voimme myös suorittaa yllä olevan tehtävän seuraavasti:
# 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)
Tällä ohjelmalla on sama lähtö kuin yllä olevalla ohjelmalla.
Tiettyjen poikkeusten saaminen Pythonissa
Edellä olevassa esimerkissä emme maininneet except
lausekkeessa mitään erityistä poikkeusta .
Tämä ei ole hyvä ohjelmointikäytäntö, koska se tarttuu kaikkiin poikkeuksiin ja käsittelee kaikki tapaukset samalla tavalla. Voimme määrittää, mitkä poikkeukset except
lausekkeeseen tulisi tarttua.
try
Lauseke voi olla mikä tahansa määrä except
lausekkeita käsittelemään erilaisia poikkeuksia kuitenkin vain yksi toteutetaan siinä tapauksessa tapahtuu poikkeus.
Voimme käyttää arvoja kerralla määrittelemään useita poikkeuksia poikkeuslausekkeeseen. Tässä on esimerkki näennäiskoodista.
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
Poikkeusten lisääminen Pythonissa
Python-ohjelmoinnissa poikkeuksia tuodaan esiin, kun virheitä esiintyy ajon aikana. Voimme myös nostaa poikkeuksia manuaalisesti raise
avainsanalla.
Voimme valinnaisesti siirtää arvot poikkeukseen sen selvittämiseksi, miksi kyseinen poikkeus nostettiin.
>>> 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 yritä muulla lausekkeella
Joissakin tilanteissa haluat ehkä suorittaa tietyn koodilohkon, jos sisällä oleva koodilohko try
suoritettiin ilman virheitä. Näissä tapauksissa voit käyttää valinnaista else
avainsanaa try
lauseen kanssa.
Huomaa : Muut lausekkeessa olevia poikkeuksia ei käsitellä edellisissä lukuun ottamatta lausekkeita.
Katsotaanpa esimerkkiä:
# 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)
Tuotos
Jos välitämme parittoman luvun:
Syötä numero: 1 Ei parillinen luku!
Jos välitämme parillisen luvun, vastavuoroinen lasketaan ja näytetään.
Syötä numero: 4 0,25
Jos kuitenkin välitämme 0, saamme, ZeroDivisionError
koska sisällä olevaa koodilohkoa else
ei käsitellä edeltämällä 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()
Tämän tyyppinen rakenne varmistaa, että tiedosto on suljettu, vaikka ohjelman suorittamisen aikana tapahtuisi poikkeus.