如何在没有调试符号的情况下获取OCaml中的异常行号?

wye*_*r33 4 ocaml

有没有一种很好的方法可以在没有调试符号的情况下获取OCaml中的异常行号?当然,如果我们打开调试符号并运行OCAMLRUNPARAM=b,我们就可以得到回溯.但是,我并不需要整个回溯,我想要一个没有调试符号的解决方案.目前,我们可以编写类似的代码

try
    assert false
with x ->
    failwith (Printexc.to_string x ^ "\nMore useful message")
Run Code Online (Sandbox Code Playgroud)

为了从断言中获取文件和行号,但这看起来很尴尬.有没有更好的方法来获取异常的文件和行号?

Jef*_*eld 7

有全局符号__FILE__,并__LINE__可以在任何地方使用.

$ ocaml
        OCaml version 4.02.1

# __FILE__;;
- : string = "//toplevel//"
# __LINE__;;
- : int = 2
# 
Run Code Online (Sandbox Code Playgroud)

更新

正如@MartinJambon指出的那样,还有__LOC__一个字符串,它给出了一个字符串中的文件名,行号和字符位置:

# __LOC__;;
- : string = "File \"//toplevel//\", line 2, characters -9--2"
Run Code Online (Sandbox Code Playgroud)

更新2

这些符号在Pervasives模块中定义.完整名单是:__LOC__,__FILE__,__LINE__,__MODULE__,__POS__,__LOC_OF__,__LINE_OF__,__POS_OF__.

最后三个返回有关整个表达式的信息,而不仅仅是文件中的单个位置:

# __LOC_OF__ (8 * 4);;
- : string * int = ("File \"//toplevel//\", line 2, characters 2-9", 32)
Run Code Online (Sandbox Code Playgroud)

  • 还有`__LOC__`,它将文件,行和字符范围组合成一个字符串. (3认同)