Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有调试符号的情况下获取OCaml中异常的行号?_Ocaml - Fatal编程技术网

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

如何在没有调试符号的情况下获取OCaml中异常的行号?,ocaml,Ocaml,有没有一种不用调试符号就可以在OCaml中获取异常行号的好方法?当然,如果我们打开调试符号并使用OCAMLRUNPARAM=b运行,我们可以得到回溯。然而,我并不真正需要整个回溯,我想要一个没有调试符号的解决方案。目前,我们可以编写如下代码 try assert false with x -> failwith (Printexc.to_string x ^ "\nMore useful message") 为了从assert中获取文件和行号,这看起来很尴尬。有没有更好的

有没有一种不用调试符号就可以在OCaml中获取异常行号的好方法?当然,如果我们打开调试符号并使用
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。这就是我需要的。