Tietokoneiden näyttöjä, joissa näkyy kuvaa automaatiolaboratorion laitteistosta. Monitoreiden takana näkyy sama laitteisto kuin kuvissa.

timohei.net / Opintojaksot / Opintojaksot / Soveltava ohjelmointi / Python-ohjelmointi /
Virheensietoinen ohjelmointi

Python tukee virheensietoista ohjelmointia. try - except -rakenteella voidaan varautua ohjelman suorituksen aikaisiin virheisiin ja saada ohjelma jatkamaan toimintaansa virheestä huolimatta.

Yksi melko yleinen virhe ohjelman suorituksen aikana on nollalla jakaminen. Esimerkkiohjelmassa luetaan näppäimistöltä jaettava ja jakaja.

luku1 = float(input("Anna jaettava! "))
luku2 = float(input("Anna jakaja! "))
tulos = luku1 / luku2
print(luku1,"jaettuna luvulla",luku2,"on",tulos)

Mikäli jakajaksi annetaan nolla, ohjelman suoritus keskeytyy virheilmoitukseen:

>>>
= RESTART: C:/Users/timohei/Soveltava ohjelmointi/try-except.py
Anna jaettava! 3
Anna jakaja! 0
Traceback (most recent call last):
  File "C:/Users/timohei/Soveltava ohjelmointi/try-except.py", line 3, in 
    tulos = luku1 / luku2
ZeroDivisionError: float division by zero
>>>

Vihreilmoituksesta nähdään virheen tyyppi ZeroDivisionError. Sijoittamalla jakolaskun suorittava rivi try-lohkoon, saadaan nollalla jaosta aiheutuva virhe käsiteltyä except ZeroDivisionError -poikkeuksenhallinnalla:

luku1 = float(input("Anna jaettava! "))
luku2 = float(input("Anna jakaja! "))
try:
    tulos = luku1 / luku2
except ZeroDivisionError:
    print("Jaettiin nollalla, tulosta ei ole määritelty.")
else:
    print(luku1,"jaettuna luvulla",luku2,"on",tulos)

Sijoittamalla jakajan kysely "ikuiseen" while-silmukkaan (ehtona True), saadaan ohjelma kysymään uutta jakajaa, kunnes annetaan nollasta poikkeava jakaja. Tällöin tulostetaan jakolaskun tulos ja poistutaan silmukasta break-käskyllä:

luku1 = float(input("Anna jaettava! "))
while True:
    luku2 = float(input("Anna jakaja! "))
    try:
        tulos = luku1 / luku2
    except ZeroDivisionError:
        print("Jaettiin nollalla, tulosta ei ole määritelty.")
    else:
        print(luku1,"jaettuna luvulla",luku2,"on",tulos)
        break

Lisää aiheesta

  1. Python Built-in Exceptions (w3schools.com)
  2. Built-in Exceptions > Concrete Exceptions (python.org)
Päivitetty 14.11.2023

<<  Edellinen
(11) Tiedostojen käsittely
Sivu 12/17Seuraava >>
(13) Paketti - moduuli - kirjasto
© Timo Heikkinen | timo piste heikkinen at oamk piste fi