我有一个非常短的测试文件:
let print_backtrace () = try raise Not_found with
Not_found -> Printexc.print_backtrace stdout;;
let f () = print_backtrace (); Printf.printf "this is to make f non-tail-recursive\n";;
f ();
我编译并运行:
% ocamlc -g test.ml
% OCAMLRUNPARAM=b ./a.out
Raised at file "test.ml", line 1, characters 35-44
this is to make f non-tail-recursive
为什么不是f
在堆栈跟踪中列出?如何编写一个函数来打印调用它的位置的堆栈跟踪?
的文档Printexc.print_backtrace
says:
回溯列出了最近引发异常的程序位置以及通过函数调用传播异常的位置。
它实际上似乎在做正确的事情。异常尚未通过 f 传播回来。
如果我将通话转移到Printexc.print_backtrace
呼叫之外f
,我看到完整的回溯。
$ cat test2.ml
let print_backtrace () = raise Not_found
let f () = let res = print_backtrace () in res ;;
try f () with Not_found -> Printexc.print_backtrace stdout
$ /usr/local/ocaml312/bin/ocamlc -g test2.ml
$ OCAMLRUNPARAM=b a.out
Raised at file "test2.ml", line 1, characters 31-40
Called from file "test2.ml", line 3, characters 21-39
Called from file "test2.ml", line 5, characters 4-8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)