如何在捕获后在erlang中编写异常堆栈跟踪?

时间:2009-08-26 15:55:35

标签: exception erlang stack

假设我有这样的事情:

try code_that_fails()
catch _:_ -> .....

如何在catch块中打印stacktrace?该块捕获所有异常,但我不知道如何打印堆栈......

你能帮助我吗?

3 个答案:

答案 0 :(得分:24)

从Erlang 21.0开始,有一种新的官方方式来获取堆栈跟踪。异常中第三个参数的try expression中的可选模式匹配,它将包含堆栈跟踪:

try
   code_that_fails()
catch
   _:_:Stacktrace ->
      erlang:display(Stacktrace)
end

旧版本(OTP 20及以下)

对于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 erlangerlang:get_stacktrace/0

中了解详情