Eccezioni in Ocaml
Nel linguaggio Ocaml per dichiarare un'eccezione uso il costrutto exception
exception nome
Dove nome è la nuova eccezione che voglio definire.
Il nome deve iniziare con una lettera maiuscola.
Una volta creata, posso sollevare un'eccezione con il costrutto raise
raise nome
Un esempio pratico
Creo una funzione per calcolare il fattoriale di un numero
let rec fattoriale = function
0 -> 1
| n -> n*fattoriale(n-1)
Con i numeri positivi funziona bene
fattoriale(3);;
- : int = 6
Con i numeri negativi, invece, la funzione produce un errore di stack overflow.
fattoriale(-3);;
Stack overflow during evaluation (looping recursion?).
Per impedire che accada, prima dichiaro un'eccezione con il costrutto exception
exception FattorialeNegativo;;
Poi modifico la funzione aggiungendo un controllo sull'argomento.
Se l'argomento è negativo, la funzione solleva l'eccezione FattorialeNegativo tramite il costrutto raise
let rec fattoriale = function
0 -> 1
| n -> if n<0 then raise FattorialeNegativo
else n*fattoriale(n-1)
Quando uso la funzione con un argomento negativo, la funzione va subito in errore senza andare in loop, sollevando l'eccezione FattorialeNegativo.
fattoriale(-3);;
Exception: FattorialeNegativo
L'eccezzione rende più intuitiva la causa dell'errore.
E così via.