OCaml/Wyjątki
Z Wikibooks, biblioteki wolnych podręczników.
Caml swoją implementację wyjątków oparł o mechanizm dopasowywania. W module Pervasives znajdziemy definicję funkcji failwith i invalid_arg, które tworzą i "podnoszą" (ang. raise) wyjątki Failure i Invalid_argument z podanym ciągiem znaków. Ponadto znajdziemy tam zdefiniowany wyjątek "Exit", który może być użyty do opuszczania pętli i rekurencji. Prosto możemy tworzyć własne wyjątki.
(* Stwórz wyjątek *) # exception Empty;; exception Empty # let get_head lst = match lst with | [] -> raise Empty | hd :: tl -> hd;; val head : 'a list -> 'a = <fun> # get_head [1; 2];; - : int = 1 # get_head [];; Exception: Empty. # let head = try get_head [] with | Empty -> print_endline "Niestety lista pusta!"; 0;; (* Ustaw głowę na zero *) Niestety lista pusta! val head : int = 0
Jak widać, wyjątki tworzy się przy wykorzystaniu słowa kluczowego exception. Jeśli będziemy chcieli by wyjątek posiadał jakiś określony typ, stworzymy go następująco:
# exception Error of int;; exception Error of int # raise (Error 10);; Exception: Error 10.
Podczas dopasowywania wartości wyjątków odczytujemy tak jak to ma miejsce przy normalnym dopasowywaniu. Wiele funkcji z biblioteki standardowej używa wyjątków żeby poinformować programistę o niemożności wykonania niektórych zadań.