假设我有这样的事情:
try code_that_fails()
catch _:_ -> .....
如何打印在catch块的堆栈跟踪? 该块捕获所有的异常,但我不知道如何打印堆栈...
你能帮助我吗?
假设我有这样的事情:
try code_that_fails()
catch _:_ -> .....
如何打印在catch块的堆栈跟踪? 该块捕获所有的异常,但我不知道如何打印堆栈...
你能帮助我吗?
从二郎21.0起,有获得堆栈跟踪新的官方途径。 一个可选的模式匹配在尝试表达在异常的第三个参数,其中将包含堆栈跟踪:
try
code_that_fails()
catch
_:_:Stacktrace ->
erlang:display(Stacktrace)
end
对于二郎/ OTP 20以下的版本,你需要使用get_stacktrace / 0 ,它可以让你获得调用进程的最后一个异常的堆栈跟踪:
try
code_that_fails()
catch
_:_ ->
erlang:display(erlang:get_stacktrace())
end
你的问题的回答是:
io:format("Backtrace ~p~n", [erlang:get_stacktrace()])
目前的功能是在列表的头部。 更多的man 3erl erlang
或二郎:get_stacktrace / 0
在你的榜样,你不需要try
; 你可以做
result = (catch code_that_fails()).
如果将引发异常, catch
返回一个包含一个元组的错误代码和堆栈跟踪 。
请注意,这通常被认为是不好的做法,因为它可以掩盖例外。 在另一个答案中所描述的堆栈跟踪方法几乎可以肯定是你想要的。
try
是原始的扩展catch
功能; 如果你使用它,你需要为你想捕捉到每一个异常类型指定条款,并适当地处理它们。 见部分的6.18 / 6.19 的Erlang参考手册的详细信息和明确的例子。