【发布时间】:2018-11-19 00:22:51
【问题描述】:
默认情况下,Failure 异常打印如下:
# print_endline (Printexc.to_string (Failure "uh\noh"));;
Failure("uh\noh")
为了提高可读性,我们希望按原样打印Failure 的参数,因为我们知道它应该是人类可读的。在 OCaml 标准库中,我们将使用以下内容初始化应用程序:
# Printexc.register_printer (function
| Failure s -> Some ("Failure: " ^ s)
| _ -> None
);;
Printexc.to_string 的新行为是:
# print_endline (Printexc.to_string (Failure "uh\noh"));;
Failure: uh
oh
太好了。现在,如果我们使用 core_kernel 库,首先我们可以看到打印异常略有不同,但对人类读者来说并不是更好:
#require "core_kernel";;
# print_endline (Printexc.to_string (Failure "uh\noh"));;
(Failure "uh\
\noh")
也许我们可以覆盖它?让我们试试吧。
# Printexc.register_printer (function
| Failure s -> Some ("Failure: " ^ s)
| _ -> None
);;
# print_endline (Printexc.to_string (Failure "uh\noh"));;
Failure: uh
oh
这可行,但它没有使用属于Core_kernel 的打印机。如果我们使用它,我们仍然会得到同样不可读的结果:
# print_endline (Core_kernel.Exn.to_string (Failure "uh\noh"));;
(Failure "uh\
\noh")
而Core_kernel.Exn 不提供register_printer 功能。如此有效,看起来Core_kernel.Exn 确保我们不定义自定义异常打印机。如果我们想显示人类可读的错误消息,还有其他方法还是我们不应该使用Core_kernel.Exn?
编辑:对于上下文,我们最初的问题是很好地打印嵌套的错误消息。例如,我们想阅读如下内容:
Uncaught exception: Failure:
Uncaught exception in subprocess 1234: Failure:
something happened
trace line 1
trace line 2
trace line 1
trace line 2
trace line 3
我们使用缩进进行引用和转义,而不是双引号和反斜杠转义序列。
【问题讨论】: