Lua:
Virheiden käsittely

Miten:

Lua käyttää kahta pääfunktiota virheiden käsittelyyn: pcall ja xpcall. Näin käytät niitä:

function might_fail()
    if math.random() > 0.5 then
        error("Hups! Jotain meni pieleen.")
    else
        print("Kaikki hyvin!")
    end
end

-- Käyttäen pcall
local success, errorMessage = pcall(might_fail)

if success then
    print("Onnistui!")
else
    print("Saatiin kiinni virhe:", errorMessage)
end

-- Käyttäen xpcall virhekäsittelijän kanssa
function myErrorHandler(err)
    print("Virhekäsittelijä sanoo:", err)
end

local status = xpcall(might_fail, myErrorHandler)
print("Onnistuiko kutsu?", status)

Esimerkkitulostus voisi olla:

Saatiin kiinni virhe: Hups! Jotain meni pieleen.
Virhekäsittelijä sanoo: Hups! Jotain meni pieleen.
Onnistuiko kutsu? false

Tai, jos virhettä ei tapahdu:

Kaikki hyvin!
Onnistui!
Kaikki hyvin!
Onnistuiko kutsu? true

Syventävä katsaus

Virheiden käsittely eli “poikkeusten käsittely” ei aina ollut asia. Varhaiset ohjelmat kaatuivat – paljon. Ohjelmoinnin kehittyessä syntyi myös tarve vakaudelle. Luassa lähestymistapa on yksinkertainen verrattuna joihinkin muihin kieliin. Ei ole try/catch lohkoja, vain pcall ja xpcall. Ensimmäinen suojaa funktion kutsua palauttamalla tilan ja mahdollisen virheen. Jälkimmäinen lisää virheenkäsittelyfunktion, joka on hyödyllinen räätälöityä puhdistusta tai lokitusta varten.

Luassa vaihtoehtona on käyttää assert, joka voi toimia samankaltaisessa tarkoituksessa heittämällä virheen, jos sen ehto on väärä. Mutta se ei ole yhtä joustava kuin pcall monimutkaisissa virheenkäsittelyskenaarioissa.

Sisäisesti pcall ja xpcall toimivat luomalla “suojatun ympäristön” funktion suorittamiselle. Jos virhe ponnahtaa esiin, ympäristö ottaa sen kiinni ja voi joko käsitellä sen heti tai passittaa sen takaisin ohjelman käsiteltäväksi.

Katso myös