OCaml/Wyjątki
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ń.