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

Fra*_*sco 16 erlang stack exception

假设我有这样的事情:

try code_that_fails()
catch _:_ -> .....
Run Code Online (Sandbox Code Playgroud)

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

你能帮助我吗?

Chr*_*ian 27

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

try
   code_that_fails()
catch
   _:_:Stacktrace ->
      erlang:display(Stacktrace)
end
Run Code Online (Sandbox Code Playgroud)

旧版本(OTP 20及以下)

对于Erlang/OTP 20及更低版本的版本,您需要使用get_stacktrace/0,它允许您获取调用进程中最后一个异常的堆栈跟踪:

try
   code_that_fails()
catch
   _:_ ->
      erlang:display(erlang:get_stacktrace())
end
Run Code Online (Sandbox Code Playgroud)


gle*_*ber 6

你的问题的答案是:

io:format("Backtrace ~p~n", [erlang:get_stacktrace()])
Run Code Online (Sandbox Code Playgroud)

当前功能位于列表的首位.阅读更多man 3erl erlang或者erlang:get_stacktrace/0


ire*_*ses 5

在您的示例中,您不需要try; 你可以做

result = (catch code_that_fails()).
Run Code Online (Sandbox Code Playgroud)

如果引发异常,则catch返回一个包含错误代码和堆栈跟踪的元组 。

请注意,这通常被认为是不好的做法,因为它可以掩盖异常。另一个答案中描述的stacktrace方法几乎肯定是您想要的。

try是原始catch功能的扩展;如果使用它,则需要为要捕获的每种异常类型指定子句,并进行适当处理。有关详细信息和清晰示例,请参见《Erlang参考手册》的 6.18 / 6.19部分。

  • 仅使用`catch`通常被认为是错误的形式。如果您不知道要捕获“每个”异常,则可能不希望它。它会使某些错误很难发现。 (2认同)
  • @亚当·林德伯格(Adam Lindberg):谢谢-这将解释反对票。我将编辑我的答案。 (2认同)