假设我有这样的事情:
try code_that_fails()
catch _:_ -> .....
如何在catch块中打印stacktrace?该块捕获所有异常,但我不知道如何打印堆栈......
你能帮助我吗?
答案 0 :(得分:24)
从Erlang 21.0开始,有一种新的官方方式来获取堆栈跟踪。异常中第三个参数的try expression中的可选模式匹配,它将包含堆栈跟踪:
try
code_that_fails()
catch
_:_:Stacktrace ->
erlang:display(Stacktrace)
end
对于Erlang / OTP 20及更低版本的版本,您需要使用get_stacktrace/0,它允许您获取调用过程中最后一个异常的堆栈跟踪:
try
code_that_fails()
catch
_:_ ->
erlang:display(erlang:get_stacktrace())
end
答案 1 :(得分:5)
在您的示例中,您不需要try
;你可以做到
result = (catch code_that_fails()).
如果引发异常,catch
会返回包含error code and stack trace的元组。
请注意,这通常被认为是不好的做法,因为它可以掩盖异常。另一个答案中描述的堆栈跟踪方法几乎肯定是你想要的。
try
是原始catch
功能的扩展;如果你使用它,你需要为你想要捕获的每个异常类型指定子句,并适当地处理它们。有关详细信息和明确示例,请参阅Erlang reference manual的第6.18 / 6.19节。
答案 2 :(得分:5)
您的问题的答案是:
io:format("Backtrace ~p~n", [erlang:get_stacktrace()])
当前功能位于列表的首位。在man 3erl erlang
或erlang:get_stacktrace/0