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

Exception 捕获异常堆栈跟踪后,如何在erlang中编写异常堆栈跟踪?,exception,erlang,stack,Exception,Erlang,Stack,假设我有这样的东西: try code_that_fails() catch _:_ -> ..... 如何在catch块中打印stacktrace?该块捕获所有异常,但我不知道如何打印堆栈 你能帮我吗?在你的例子中,你不需要试试;你可以这么做 result = (catch code_that_fails()). 如果引发异常,catch返回包含异常的元组 注意,这通常被认为是不好的做法,因为它可以掩盖异常。另一个答案中描述的stacktrace方法几乎可以肯定是您想要的 try是原

假设我有这样的东西:

try code_that_fails()
catch _:_ -> .....
如何在catch块中打印stacktrace?该块捕获所有异常,但我不知道如何打印堆栈


你能帮我吗?

在你的例子中,你不需要
试试
;你可以这么做

result = (catch code_that_fails()).
如果引发异常,
catch
返回包含异常的元组

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


try
是原始
catch
功能的扩展;如果使用它,则需要为要捕获的每个异常类型指定子句,并适当地处理它们。有关详细信息和清晰示例,请参见的第6.18/6.19节。

您的问题的答案是:

io:format("Backtrace ~p~n", [erlang:get_stacktrace()])

当前函数位于列表的最前面。从erlang 21.0开始,有一种新的官方方法来获取堆栈跟踪,请阅读《man 3erl erlang》或《erlang 21.0》中的更多内容。中的可选模式匹配位于异常中的第三个参数上,该参数将包含堆栈跟踪:

try
   code_that_fails()
catch
   _:_:Stacktrace ->
      erlang:display(Stacktrace)
end
旧版本(OTP 20及以下) 对于Erlang/OTP 20及以下版本,您需要使用,它允许您获取调用过程中最后一个异常的堆栈跟踪:

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

仅仅使用
catch
通常被认为是不好的形式。如果您不知道您想要捕获每个异常,那么您可能不想要它。这会使一些bug更难找到。@Adam Lindberg:谢谢-这可以解释为什么会有反对票。我将编辑我的答案。非常感谢你们大家!!:)Francesco,如果您对其中一个答案感到满意,请将其标记为适当/满意的答案,以供将来参考,并添加以下注释:请注意,自OTP 23
erlang:get\u stack\u trace()
返回空列表时,它已被弃用。