Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

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ä.

Code Block
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.

Code Block
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.

Code Block
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.")