Selles õpetuses saate teada, kuidas Python programmis erandeid käsitleda näidete abil try, va ja lõpuks lausetega.
Video: Pythoni erandkäsitlus (proovige … välja arvatud … lõpuks)
Erandid Pythonis
Pythonil on palju sisseehitatud erandeid, mis tekivad siis, kui teie programm tuvastab vea (programmis midagi läheb valesti).
Nende erandite ilmnemisel peatab Pythoni tõlk praeguse protsessi ja edastab selle helistamisprotsessile, kuni see on käsitletud. Kui seda ei käsitleta, jookseb programm kokku.
Vaatleme näiteks programmi, kus meil on funktsioon, A
mis kutsub funktsiooni B
, mis omakorda kutsub funktsiooni C
. Kui funktsioonis esineb erand, C
kuid seda ei käsitleta C
, läheb erand edasi B
ja seejärel A
.
Kui seda kunagi ei tehta, kuvatakse tõrketeade ja meie programm peatub ootamatult ootamatult.
Erandite püüdmine Pythonis
Pythonis saab erandeid käsitleda try
avalduse abil.
Kriitiline toiming, mis võib põhjustada erandi, paigutatakse try
klausli sisse. Kood, mis käsitleb erandeid, on kirjutatud except
klauslisse.
Niisiis saame valida, milliseid toiminguid teha, kui oleme erandi saanud. Siin on lihtne näide.
# 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)
Väljund
Kirje on Oih! toimunud. Järgmine kirje. Kirje on 0 Vabandust! tekkis. Järgmine kirje. Kirje on 2. 2 vastastik on 0,5
Selles programmis tutvume randomList loendi väärtustega. Nagu varem mainitud, paigutatakse osa, mis võib põhjustada erandi, try
ploki sisse.
Kui erandit ei toimu, jäetakse except
plokk vahele ja normaalne voog jätkub (viimase väärtuse jaoks). Kuid kui mõni erand ilmneb, haaratakse see except
plokist (esimene ja teine väärtus).
Siinkohal printime erandi nime, kasutades moodulisisest exc_info()
funktsiooni sys
. Näeme, mis a
põhjustab ValueError
ja 0
põhjustab ZeroDivisionError
.
Kuna iga Pythoni erand pärandub baasklassist Exception
, saame ülaltoodud ülesande täita ka järgmisel viisil:
# 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)
Sellel programmil on sama väljund nagu ülaltoodud programmil.
Konkreetsete erandite püüdmine Pythonis
Eespool toodud näites ei maininud me except
klauslis ühtegi konkreetset erandit .
See ei ole hea programmeerimistava, sest see haarab kinni kõik erandid ja tegeleb kõigi juhtumitega ühtemoodi. Saame täpsustada, milliseid erandeid except
klausel peaks tabama.
try
Klausel võib olla suvaline arv except
punkte käsitseda erinevaid erandeid, aga ainult üks täidetakse juhul erand esineb.
Väärtuste hulga abil saame erandklauslis määrata mitu erandit. Siin on näide pseudokoodist.
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
Erandite suurendamine Pythonis
Pythoni programmeerimisel tehakse erandeid, kui käituse ajal ilmnevad vead. Samuti võime raise
märksõna abil erandeid käsitsi tõsta .
Võime valikuliselt anda erandile väärtused, et selgitada, miks see erand tõsteti.
>>> 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 proovige klausliga else
Mõnes olukorras võiksite käivitada teatud koodiploki, kui sees olev koodiplokk try
jooksis ilma tõrgeteta. Nendel juhtudel saate avaldusega kasutada valikulist else
märksõna try
.
Märkus . Eelnevad, välja arvatud klauslid, ei käsitle klausli muu erandeid.
Vaatame näidet:
# 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)
Väljund
Kui läbime paaritu arvu:
Sisestage arv: 1 Pole paarisarv!
Kui läbime paarisarvu, arvutatakse ja kuvatakse vastastikune.
Sisestage number: 4 0,25
Kui aga möödume 0-st, saame, ZeroDivisionError
kuna sisemist koodiplokki else
ei käsitleta eelnevaga 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()
Seda tüüpi konstruktsioon tagab, et fail on suletud, isegi kui programmi käivitamisel ilmneb erand.