OCamlでエラーハンドリングしたい
1. exception でエラーを定義
2. raise でエラーを投げる
3. tyr ... with ... でエラーをハンドリング
4. Printexc.to_string でエラーメッセージを取得
5. Printf.eprintf で標準エラー出力へ表示
code:fib.ml
(* 1. エラーを定義 *)
exception FibError of string * int
let rec fib n =
if n < 0 then
(* 2. raise でエラーを投げる *)
raise (FibError ("n must be positive", n))
else if n = 0 then 0
else if n = 1 then 1
else (fib (n - 1)) + (fib (n - 2))
let () =
if (Array.length Sys.argv < 2) then
Printf.eprintf "usage: ocaml fib.ml n\n"
else
let a = Sys.argv.(1) in
let n = (int_of_string a) in
(* 3. try ... with ... でエラーをハンドリング *)
try
let result = fib n in
Printf.printf "fib(%d) = %d" n result
with err ->
(* 4. Printexc.to_string でエラーの詳細を文字列として取得 *)
let msg = Printexc.to_string err in
(* 5. Printf.eprintf で標準エラー出力へ表示 *)
Printf.eprintf "Err: %s\n" msg
実行してみる
code:sh
$ ocaml fib.ml 10
fib(10) = 55
$ ocaml fib.ml -10
Err: FibError("n must be positive", -10)
$
参考
Error Handling