-
Réponse propre quand il n'y a pas de réponse pertinente
- failwith déjà vu
- Des exceptions nommées (plus précis pour récupérer, etc.)
- Un mécanisme de traitement d'exceptions doit permettre de
réaliser trois actions :
-
déclarer une exception (si elle n'est pas prédéfinie);
- déclencher, lever, ou signaler une exception;
- traiter l'exception.
- Les exceptions prédéfinies
exception Division_by_zero
exception Out_of_memory
exception Invalid_argument of string
exception Failure of string
exception Not_found
- Deux levées d'exceptions prédéfinies
value failwith : string -> 'a
value invalid_arg : string -> 'a
- Exemples de levée des exceptions prédéfinies
#(* Par des opérations prédéfinies *)
1/0;;
Exception non rattrapée: Division_by_zero
#hd [];;
Exception non rattrapée: Failure "hd"
#[|1;2;3|].(10);;
Exception non rattrapée: Invalid_argument
"vect_item"
#(* Par des fonctions que l'on définit *)
let rec member =
function nom -> function liste ->
match liste with
| [] -> raise Not_found
| e::l -> e=nom || member nom l;;
member : 'a -> 'a list -> bool = <fun>
#member 1 [1;2;3];;
- : bool = true
#member 4 [1;2;3];;
Exception non rattrapée: Not_found
#let chiffre1 = function n ->
if n < 10 then n else
raise (Invalid_argument (string_of_int n));;
chiffre1 : int -> int = <fun>
#chiffre1 12;;
Exception non rattrapée: Invalid_argument
"12"
#let chiffre2 = function n ->
if n < 10 then n else
invalid_arg (string_of_int n);;
chiffre2 : int -> int = <fun>
#chiffre2 12;;
Exception non rattrapée: Invalid_argument
"12"
#let chiffre3 = function n ->
if n < 10 then n else
failwith "chiffre3: argument > 10";;
chiffre3 : int -> int = <fun>
#chiffre3 12;;
Exception non rattrapée: Failure
"chiffre3: argument > 10"
#let chiffre4 = function n ->
if n < 10 then n else
raise (Failure "chiffre4: argument > 10");;
chiffre4 : int -> int = <fun>
#chiffre4 12;;
Exception non rattrapée: Failure
"chiffre4: argument > 10"
- Déclaration (exception) et type (exn, type
somme prédéfini extensible)
#(* Sans argument *)
exception Stop;;
L'exception Stop est définie.
#Stop;;
- : exn = Stop
#(* Avec argument *)
exception Trouvé of int;;
L'exception Trouvé est définie.
#Trouvé;;
- : int -> exn = <fun>
#Match_failure;;
- : string * int * int -> exn = <fun>
- Levée (raise)
...
raise exception
...
- Exemples de levées d'exceptions définies
#let search = function e -> function v ->
for i = 0 to vect_length v - 1 do
if v.(i)=e then raise (Trouvé i)
done;;
search : 'a -> 'a vect -> unit = <fun>
#let search = function e -> function v ->
let i = ref 0 in
while true do
if v.(!i)=e then raise (Trouvé !i);
i := !i+1
done;;
search : 'a -> 'a vect -> unit = <fun>
#search "B" [|"A";"B";"C";"D"|];;
Exception non rattrapée: Trouvé 1
#search "E" [|"A";"B";"C";"D"|];;
Exception non rattrapée: Invalid_argument
"vect_item"
#let failwith s = raise (Failure s);;
failwith : string -> 'a = <fun>
Une levée d'exception est un effet de bord.
- Rattrapage ou récupération (try ... with)
try expression with
| exception_1 -> expression_1
| exception_2 -> expression_2
| :
| exception_n -> expression_n
On appelle l'expression try ... with le traite-exception de
l'exception exception_j.
Chaque expression_i peut lever à nouveau une des
exceptions exception_j.
#(* Sous-vecteur d'un vecteur v commençant
à la première occurrence de l'élément e
dans v *)
let sous_vecteur =
function e -> function v ->
try search e v;[|"impossible"|] with
| Trouvé i ->
sub_vect v i (vect_length v - i)
| Invalid_argument "vect_item" -> [||];;
sous_vecteur : string -> string vect ->
string vect = <fun>
#sous_vecteur "B" [|"A";"B";"C";"D"|];;
- : string vect = [|"B"; "C"; "D"|]
#sous_vecteur "E" [|"A";"B";"C";"D"|];;
- : string vect = [||]
#let sans_doublons = function v ->
try
for i = 0 to vect_length v - 1 do
if v.(i)=v.(i+1) then raise Stop
done; true
with Stop -> false;;
sans_doublons : 'a vect -> bool = <fun>
#exception absent of int;;
L'exception absent est définie.
#let rec trouve_nom =
function numéro -> function amphi ->
match amphi with
| [] -> raise (absent numéro)
| (x,n)::reste ->
if n=numéro then x
else trouve_nom numéro reste;;
trouve_nom : int -> ('a * int) list -> 'a
= <fun>
#let verif = function (numéro, amphi) ->
try (trouve_nom numéro amphi) with
| absent p -> "chercher_à_la_scolarité";;
verif : int * (string * int) list ->
string = <fun>
#exception erreur of int;;
L'exception erreur est définie.
#exception signal of string;;
L'exception signal est définie.
#let f_qui_déclenche = function x ->
if x < 0 then raise (erreur (-x)) else
if x=0
then raise (signal "reprise au vol")
else x;;
f_qui_déclenche : int -> int = <fun>
#f_qui_déclenche (-4);;
Exception non rattrapée: erreur 4
#f_qui_déclenche 2;;
- : int = 2
#let récupère = function x ->
try f_qui_déclenche x with
| erreur 0 -> 0
| erreur y -> 25-y+3*x
| signal _ -> 100*x+1;;
récupère : int -> int = <fun>
#(récupère 2),(récupère (-4)),(récupère 0);;
- : int * int * int = 2, 9, 1
- Les exceptions comme style de programmation