如何在没有调试符号的情况下获取OCaml中异常的行号?
有没有一种不用调试符号就可以在OCaml中获取异常行号的好方法?当然,如果我们打开调试符号并使用如何在没有调试符号的情况下获取OCaml中异常的行号?,ocaml,Ocaml,有没有一种不用调试符号就可以在OCaml中获取异常行号的好方法?当然,如果我们打开调试符号并使用OCAMLRUNPARAM=b运行,我们可以得到回溯。然而,我并不真正需要整个回溯,我想要一个没有调试符号的解决方案。目前,我们可以编写如下代码 try assert false with x -> failwith (Printexc.to_string x ^ "\nMore useful message") 为了从assert中获取文件和行号,这看起来很尴尬。有没有更好的
OCAMLRUNPARAM=b
运行,我们可以得到回溯。然而,我并不真正需要整个回溯,我想要一个没有调试符号的解决方案。目前,我们可以编写如下代码
try
assert false
with x ->
failwith (Printexc.to_string x ^ "\nMore useful message")
为了从assert中获取文件和行号,这看起来很尴尬。有没有更好的方法来获取异常的文件和行号?有全局符号
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和可以在任何地方使用
$ ocaml
OCaml version 4.02.1
# __FILE__;;
- : string = "//toplevel//"
# __LINE__;;
- : int = 2
#
更新
正如@MartinJambon指出的,还有\uuuu LOC\uuuu
,它在一个字符串中给出文件名、行号和字符位置:
# __LOC__;;
- : string = "File \"//toplevel//\", line 2, characters -9--2"
更新2
这些符号在中定义。完整的列表是:\uuuuuuuuuuuuu
,\uuuuuuuuu文件
,\uuuuuuuu行
,\uuuuuu模块
,\uuuuuuuuuuuuu位置
,\uuuuuuuuuuuuuuu行
最后三个返回的是关于整个表达式的信息,而不仅仅是文件中的单个位置:
# __LOC_OF__ (8 * 4);;
- : string * int = ("File \"//toplevel//\", line 2, characters 2-9", 32)
我这里有一个无耻的插件,还有一个将文件、行和字符范围组合成一个字符串的\uu LOC\uu
。@MartinJambon谢谢Martin。这就是我需要的。