在OCaml中,可以让异常带来另一个例外:
exception Example of exn
但是当从另一个模块引发此异常时,输出看起来像这样:
Module.Example(_)
对此有何解决方案?我想要的当然是
Module.Example(Not_found)
或类似的。
我在OUnit中遇到这个问题,所以我不可能用一个位置合适的try ... with
来解决它。
答案 0 :(得分:2)
建议的解决方案是不要将异常作为值包含,除非以后需要重新提升它们。
但是,有一种方法可以通过注册您自己的异常打印机来打印对您而言重要的异常的详细信息。这样做如下:
(* File exn.ml *)
exception Example of exn
let () =
Printexc.register_printer (function
| Example e ->
Some ("Example(" ^ Printexc.to_string e ^ ")")
| _ ->
None
)
let () =
try raise (Example (Example Not_found))
with e ->
Printf.eprintf "Uh oh: %s\n%!" (Printexc.to_string e)
编译并运行:
$ ocamlopt -o exn exn.ml
$ ./exn
Uh oh: Example(Example(Not_found))
答案 1 :(得分:0)
我对这些细节并不熟悉,但我怀疑如果能够可靠地检索到该名称,就会打印出来。它是在我的实验中从顶层打印出来的,但不是从编译过的代码中打印出来的。
一种可能的方法是使用Printexc.to_string
将异常转换为字符串,并使Example
携带一个字符串。或者你可以让Example携带异常和字符串。