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ń.


< powrót do spisu treści