Try with in Ocaml

Il costrutto try with nel linguaggio Ocaml mi permette di eseguire un'espressione o una funzione assegnando un valore predefinito alla risposta quando si verifica un determinato errore.

try espressione with errore -> valore

Dopo try indico l'espressione o la funzione da seguire.

Dopo with indico il codice dell'errore che voglio intercettare e il valore da assegnare alla risposta se si verifica.

In questo modo posso gestire le eccezioni a seconda dei casi.

    Un esempio pratico

    Questo script definisce un errore FattorialeNegativo e una funzione fattoriale(n) per calcolare il fattoriale di un numero.

    exception FattorialeNegativo;;
    let rec fattoriale(n) =
    match n with
    0 -> 1
    | _ -> if n<0 then raise FattorialeNegativo
    else n*fattoriale(n-1)

    La funzione ricorsiva fattoriale(n) calcola il fattoriale soltanto se l'argomento n è un numero non negativo.

    fattoriale(4);;
    - : int = 24

    Se l'argomento è un numero negativo (n<0) la funzione solleva l'eccezione FattorialeNegativo tramite l'istruzione raise.

    fattoriale(-4);;
    Exception: FattorialeNegativo

    Per evitare che si sollevi l'eccezione, posso richiamare la funzione usando il costrutto try with

    try fattoriale(-4) with FattorialeNegativo -> 0;;

    In questo modo, quando si verifica l'eccezione FattorialeNegativo la funzione restituisce 0

    Dove zero è il valore che ho assegnato alla funzione tramite la clausola with FattorialeNegativo -> 0

    - : int = 0

    Ovviamente, il costrutto try with interviene solo se si verifica il codice di quell'eccezione.

    Se si verificano altri errori, questi non sono intercettati.

    Ad esempio, se richiamo lo stesso costrutto passando come argomento 4/0

    try fattoriale(-4) with FattorialeNegativo -> 0;;
    exception: Division_by_zero

    La funzione va in errore Division_by_zero

    E così via.

     


     

    Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

    FacebookTwitterLinkedinLinkedin
    knowledge base

    Ocaml