Poikkeukset ovat ohjelmoinnissa keino käsitellä virhetilanteita. Virhetilanteen sattuessa luodaan poikkeus, joka voidaan ns. ottaa kiinni poikkeuksille tarkoitetuilla rakenteella. Jos poikkeusta ei oteta kiinni, ohjelma kaatuu ja tulostetaan poikkeuksen yhteydessä oleva virhe viesti.

Poikkeuksia syntyy ohjelmointivirheistä kun Pythonin sisäänrakennettuja rakenteita käytetään väärin kuten jakamalla nollalla tai syöttämällä funktioihin parametreiksi sopimattomia arvoja. Poikkeuksia voi syntyä myös vaikka ohjelmoinnissa ei ole virheitä; esim. tiedostoa avattaessa avattavaa tiedostoa ei välttämättä löydy, mikä synnyttää virheen vaikka ohjelma olisi ihan toimiva.

Poikkeuksia voi synnyttää myös itse avainsanalla raise, jonka jälkeen kirjoitetaan haluttu poikkeus, jolle annetaan virhe viesti kirjoittamalla poikkeuksen jälkeen sulkeisiin merkkijono. Tässä esimerkissä synnytetään tahallisesti poikkeus, jota ei käsitellä.

raise ZeroDivisionError("ei voi jakaa nollalla")

input("Paina Enter-näppäintä lopettaaksesi.")

Poikkeuksia voidaan synnyttää itse tehdyissä funktioissa esimerkiksi viestittämään vääränlaisista parameterista ja muista virheistä.

Poikkeukset käsitellään avainsanalla try alkavalla rakenteella ja sitä seuraavilla except ja/tai finally lohkoilla. Lohkoon try tulee varsinainen koodi, joka halutaan ajaa ja jossa saattaa syntyä poikkeuksia. Lohkoon except vastaavan avainsanan lisäksi poikkeuksen, joka halutaan käsitellä. Poikkeukset ovat oliota ja poikkeusolioita määrittäviä luokkia useita, siksi täytyy määrittää mikä poikkeus halutaan käsitellä. Märittämällä käsiteltäväksi poikkeukseksi Exception käsitellään osiossa kaikki poikkeukset, koska kaikki poikkeusluokat perivät tämän luokan (perinnästä tarkemmin myöhemmin).

Tässä esimerkissä jaetaan luku nollalla ja otetaan siitä syntynyt poikkeus kiinni try-except rakenteella.

try:
    a = 1 / 0
except ZeroDivisionError:
    print("Nollalla jako käsitelty.")

input("Paina Enter-näppäintä lopettaaksesi.")

Jos ei kumminkaan ole except lohkoa, jossa poikkeus käsiteltäisiin, niin ohjelma kaatuu. Tähän voi kuitenkin vaikuttaa finally osiolla, joka ajetaan ohjelman kaatuessa vastaavassa try lohkossa tapahtuneen virheen seurauksena. Tässä esimerkissää tallennetaan luodun poikkeuksen virhe tulostus tiedostoon ja kerrotaan modulin time funktion localtime avulla kellonaika jolloin virhe tapahtui.

import time

s = "Ohjelmassa tapahtui virhe, jonka takia se suljettiin klo %s:%s."

try:
    a = 3 + "w"
except ZeroDivisionError:
    print("Nollalla jako käsitelty.")
finally:
    errorLog = open("errorlog.txt", 'w')
    errorLog.write(s % (time.localtime()[3], time.localtime()[4]))
    errorLog.close()

input("Paina Enter-näppäintä lopettaaksesi.")
  • No labels
You must log in to comment.