Pythonis erindite käsitlus: Kuidas vigu efektiivselt hallata?

1. Ülevaade erindite käsitlusest Pythonis

Mis on erindite käsitlus Pythonis?

Programmi käivitamisel võib tekkida ootamatuid vigu, mida nimetatakse erinditeks. Kui erind tekib, lõpetab programm tavaliselt töö. Python pakub mehhanismi, millega saab neid erindeid töödelda, et programm ei katkeks ootamatult. Erindite käsitlust kasutades saab programm vigadele asjakohaselt reageerida ning jätkata tööd.

Miks on erindite käsitlus oluline?

Erindite käsitlus võimaldab programmil jätkata tööd kasutajasõbralikult ka vigade esinemisel. Lisaks aitab see vigu tuvastada ja siluda, mis parandab programmi töökindlust ja usaldusväärsust.

2. Mis on try-except lause?

Põhisüntaks

Pythonis kirjutatakse veaohtlik kood try-plokki ning veaga toimetulek except-plokki. Põhisüntaks on järgmine:

try:
    # Kood, mis võib tekitada vea
except SomeError:
    # Kood vea käsitlemiseks

Kui try-plokis olev kood töötab probleemideta, siis except-plokki eiratakse. Kui tekib määratud erind, siis tegeleb programm sellega except-plokis.

Levinud näide: Nulliga jagamise viga

Kui proovite jagada nulliga, tekib ZeroDivisionError. Selle saab käsitleda järgmiselt:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Nulliga jagamine ei ole lubatud")

 

年収訴求

3. Levinumad erindid ja nende käsitlemine

1. ZeroDivisionError

See erind tekib, kui proovitakse jagada arv nulliga. Näiteks kui jagate arvu 0-ga, viskab Python automaatselt ZeroDivisionErrori.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Nulliga jagamine ei ole lubatud")

2. ValueError

ValueError tekib, kui funktsioonile või operatsioonile antakse sobimatu väärtus. Näiteks allpool püütakse sõne teisendada arvuks, mis ei ole võimalik:

try:
    num = int("not_a_number")
except ValueError:
    print("Vigane väärtus")

3. Kuidas käsitleda mitut erindit korraga

Kui soovite töödelda mitut erindit korraga, saate need except plokis kokku liita:

try:
    result = 10 / "string"
except (ZeroDivisionError, TypeError):
    print("Ilmnes viga")

4. Vigade detailsem tuvastamine erindi objektiga

Erindi objekti saamine as abil

except-lausel võimaldab as-märksõnaga saada erindi objekti, millega saab viidata üksikasjalikule veateabele või logida seda.

try:
    a = 10 / 0
except ZeroDivisionError as e:
    print(f"Ilmnes viga: {e}")

Selles näites salvestatakse veateade muutujasse e ning kuvatakse detailid.

5. finally-ploki kasutamine

Mis on finally?

finally-plokki kasutatakse koodi jaoks, mis tuleb käivitada alati – sõltumata sellest, kas erind tekkis või mitte. See sobib näiteks failide avamisel või andmebaasiühenduse sulgemisel.

try:
    file = open("test.txt", "r")
except FileNotFoundError:
    print("Faili ei leitud")
finally:
    print("Faili töö lõpetatud")

Ressursside vabastamine

finally on kasulik ressursside (nt failide) kindlaks sulgemiseks:

try:
    file = open("data.txt", "r")
    # Failiga töötamine
finally:
    file.close()

Nii tagate, et fail suletakse alati, isegi kui tekib viga.

6. Erindi käsitsi esilekutsumine raise-ga

Mis on raise?

raise-lause võimaldab arendajal ise tekitada erindit. Seda kasutatakse näiteks sisendi valideerimisel või tingimuste põhjal veateate esitamisel.

def check_value(value):
    if value < 0:
        raise ValueError("Negatiivsed väärtused ei ole lubatud")

Näide kohandatud erindist

Erindi käsitsi tõstmisega saate juba varakult peatada sobimatu sisendi, et vältida ootamatut käitumist.

7. Parimad tavad erindite käsitlemisel Pythonis

1. Väldi liigset erindite käsitlust

Liigne erindite käsitlemine muudab koodi loetamatuks ja raskendab silumist. Kasuta erindite käsitlust vaid seal, kus viga tõenäoliselt esineb, mitte kogu programmi ulatuses.

2. Kasuta logisid vigade salvestamiseks

Kui erind tekib, on soovitatav salvestada see logisse. See aitab hiljem vigu tuvastada. Allpool on näide logging-mooduli kasutamisest:

import logging

try:
    a = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"Ilmnes viga: {e}")

3. Väldi liiga üldist except-lauset

Püüa käsitleda võimalikult konkreetseid vigu, mitte kasutada laia except Exceptioni, sest nii võivad olulised probleemid märkamata jääda. Tuvasta ja lahenda iga erind võimalikult täpselt.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール