Az ML programozási nyelv

Kivételkezlés

Az észlelhető futásidejű hibák kezelését az ML sok más fejlett nyelvhez hasonlóan kivételkezelő mechanizmussal támogatja. Hiba detektálásakor az aktuális művelet kivált egy a hibára utaló kivételt, amelyet a vezérlést megkapó "legközelebbi" alkalmas kivételkezelő kódrész dolgoz fel. A kivételek használata segít a programok biztonságosabbá és átláthatóbbá, struktúráltabbá tételében azáltal, hogy a hibakezelő részek nyelvi szinten elkülönülnek a kód többi részétől.
ML-ben a következő (primitív) kivételek vannak előre definiálva:

Saját kivételeket az exception kulcsszóval definiálhatunk a típuskonstruktorokhoz hasonló módon. Például:

exception IllegalArgument exception SyntaxError of string

amelyeket azután például a következőképpen válthatunk ki:

raise IllegalArgument raise SyntaxError "Hiányzó azonosító"

A kivételek típusa a speciális exn típus, így a kivétel deklarációk tulajdonképpen felfoghatók az exn típus konstruktoraiként, amely ezáltal egy előre definiált, de tetszőlegesen bővíthető típusként értelmezhető.

Minden kivételkezelő részt a handle kulcsszó vezet be, amelyet a különböző kezelni kívánt kivételekre illeszkedő minták szerinti esetszétválasztás követ az anonim függvények definíciójával azonos szintaxis szerint. Például:

let val token_list = tokenize() in parse token_list end handle EndOfFile => print "Done." | SyntaxError msg => print "Syntax error: " ^ msg

Megjegyezzük, hogy a fenti példához hasonló helyzetekben a let kulcsszót követő kötésekben szereplő kifejezések kiértékelése során kiváltott kivételeket is a blokkot követő kivételkezelő rész dolgozza fel.