Haskell:
Virheiden käsittely

Miten:

Haskell käsittelee virheitä luotettavasti tyyppien kuten Maybe ja Either avulla. Tässä nopea katsaus:

safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing  -- Nollaan jakaminen ei käy, palautamme siis Nothing.
safeDivide x y = Just (x `div` y)  -- Muutoin kaikki on hyvin, palautamme tuloksen Just:ssa.

-- Katsotaanpa sitä toiminnassa:
example1 :: Maybe Int
example1 = safeDivide 10 2  -- Just 5

example2 :: Maybe Int
example2 = safeDivide 10 0  -- Nothing

Monimutkaisempaan virheenkäsittelyyn, Either tulee mukaan:

safeDivideEither :: Integral a => a -> a -> Either String a
safeDivideEither _ 0 = Left "Divide by zero error."  -- Tällä kertaa virhe sisältää viestin.
safeDivideEither x y = Right (x `div` y)

-- Ja käytössä:
example3 :: Either String Int
example3 = safeDivideEither 10 2  -- Right 5

example4 :: Either String Int
example4 = safeDivideEither 10 0  -- Left "Divide by zero error."

Syväsukellus

Haskellassa virheenkäsittelyllä on vahvat juuret. Aikoinaan virheet saattoivat kaataa koko ohjelman—ei hauskaa. Haskelin tyyppijärjestelmä tarjoaa keinoja tehdä tästä paljon epätodennäköisempää. Meillä on Maybe ja Either, mutta muitakin, kuten Exceptions ja IO eri skenaarioihin.

Maybe on yksinkertainen: saat Just jotain, jos kaikki on hyvin, tai Nothing, jos ei ole. Either ottaa askeleen pidemmälle, mahdollistaen virhesanoman (Left) tai onnistuneen tuloksen (Right) palauttamisen.

Molemmat ovat puhtaita, mikä tarkoittaa, että ne eivät sekoitu ulkomaailmaan—iso juttu Haskellessa. Vältämme tarkistamattomien poikkeusten aiheuttamat ongelmat, joista jotkut muut kielet kärsivät.

Niille, jotka eivät ole tyytyväisiä Mayben ja Eithern kanssa, kirjastot kuten Control.Exception tarjoavat perinteisempää, imperatiivista virheenkäsittelyä poikkeusten kautta. Mutta niiden liiallinen käyttö voi monimutkaistaa asioita, joten yhteisö usein pysyttelee näissä tyypeissä.

Katso Myös

Sukella syvemmälle: