Kivételek

22.1. Kérdés.
Meg tudja mondani valaki, hogy mikor, ill. mitől áll elő a Match kivétel, és hogy hogyan tudom lekezelni?

22.1. Válasz.
Hallgató: Akkor kapod ezt a kivételt, ha egy függvény fejében (illetve általában egy értékdeklarációban) nem kezeled le az összes elképzelhető esetet (erről kapod a pattern matching not exhaustive figyelmeztetést, nem véletlenül).

Lekezelni, ha valóban ezt akarod, természetesen egy handle kulcsszóval kezdődő kifejezéssel lehet. Én mégis a következőt javaslom (így a figyelmeztetéseket is elkerülöd, ami stilisztikailag is szebb):

  1. deklarálj egy saját kivételt, például:

    exception MyError of string

  2. minden olyan függvényben, amelyben szándékosan hagynál kezeletlen eseteket, vezess be egy utolsó, mindenre illeszkedő klózt (mindenesjellel az argumentumok helyén), amelyben jelezd ezt a kivételt, argumentumában a függvény nevével és lehetőleg a függény argumentumaival, pl.:

    fun f (x::xs) l = ...
      | f []      0 = ...
      | f xs      n = raise MyError ("f " ^ list2string xs ^
                                     " " ^ Int.toString n)
    Így, ha mégis ráfutna az utolsó klózra, a jelzett kivételből pontosan meg tudod állapítani, hogy melyik függvényben volt a hiba, és azt milyen argumentumokkal hívtad meg.

    Megjegyzés. A list2string függvény könyvtári függvényként nem létezik, neked kell megírnod, ha valóban ki akarod írni az argumentum értékét.

22.2. Kérdés.
Hogyan lehet egyszerre több beépített kivételt is lekezelni, pl. a aSubscript-et, a Match-et és az Empty-t?

22.2. Válasz.
Oktató: Nézze meg az előadásdiákon a kivételek kezeléséről szóló részeket! A handle kulcsszó után mindenféle minták megadhatók (akárcsak egy függvénydeklarációban vagy egy case-kifejezésben), a mindenesjel (_) is.


Deklaratív programozás - FP-GYIK
2005. március 1.