如何在没有调试符号的情况下获取 OCaml 中异常的行号?
How to get the line number of an exception in OCaml without debugging symbols?
在OCaml中有没有不用调试符号就能获取异常行号的好方法?当然,如果我们打开调试符号和 运行 和 OCAMLRUNPARAM=b
,我们可以得到回溯。但是,我真的不需要整个回溯,我想要一个没有调试符号的解决方案。目前,我们可以这样写代码
try
assert false
with x ->
failwith (Printexc.to_string x ^ "\nMore useful message")
为了从断言中获取文件和行号,但这看起来很尴尬。有没有更好的方法获取异常的文件和行号?
您可以在任何地方使用全局符号 __FILE__
和 __LINE__
。
$ ocaml
OCaml version 4.02.1
# __FILE__;;
- : string = "//toplevel//"
# __LINE__;;
- : int = 2
#
更新
正如@MartinJambon 指出的那样,还有 __LOC__
,它在一个字符串中给出了文件名、行号和字符位置:
# __LOC__;;
- : string = "File \"//toplevel//\", line 2, characters -9--2"
更新 2
这些符号在Pervasives module中定义。完整列表为:__LOC__
、__FILE__
、__LINE__
、__MODULE__
、__POS__
、__LOC_OF__
、__LINE_OF__
、__POS_OF__
.
关于整个表达式的最后三个 return 信息,而不仅仅是文件中的单个位置:
# __LOC_OF__ (8 * 4);;
- : string * int = ("File \"//toplevel//\", line 2, characters 2-9", 32)
在OCaml中有没有不用调试符号就能获取异常行号的好方法?当然,如果我们打开调试符号和 运行 和 OCAMLRUNPARAM=b
,我们可以得到回溯。但是,我真的不需要整个回溯,我想要一个没有调试符号的解决方案。目前,我们可以这样写代码
try
assert false
with x ->
failwith (Printexc.to_string x ^ "\nMore useful message")
为了从断言中获取文件和行号,但这看起来很尴尬。有没有更好的方法获取异常的文件和行号?
您可以在任何地方使用全局符号 __FILE__
和 __LINE__
。
$ ocaml
OCaml version 4.02.1
# __FILE__;;
- : string = "//toplevel//"
# __LINE__;;
- : int = 2
#
更新
正如@MartinJambon 指出的那样,还有 __LOC__
,它在一个字符串中给出了文件名、行号和字符位置:
# __LOC__;;
- : string = "File \"//toplevel//\", line 2, characters -9--2"
更新 2
这些符号在Pervasives module中定义。完整列表为:__LOC__
、__FILE__
、__LINE__
、__MODULE__
、__POS__
、__LOC_OF__
、__LINE_OF__
、__POS_OF__
.
关于整个表达式的最后三个 return 信息,而不仅仅是文件中的单个位置:
# __LOC_OF__ (8 * 4);;
- : string * int = ("File \"//toplevel//\", line 2, characters 2-9", 32)