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

18

假设我有这样一个东西:

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

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

你能帮我吗?


Francesco,如果您对其中一个答案感到满意,请将其标记为正确/令人满意的答案。 - gleber
3个回答

30

从Erlang 21.0起,有一种新的官方方法可以获取堆栈跟踪。在异常的第三个参数中,try表达式中的可选模式匹配将包含堆栈跟踪:

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

7

你的问题的答案是:

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

当前函数在列表的开头。详情请参见man 3erl erlangerlang:get_stacktrace/0

6
在您的例子中,您不需要使用try;您只需要执行
result = (catch code_that_fails()).

如果抛出异常,catch会返回一个包含错误代码和堆栈跟踪的元组。
需要注意的是,这通常被认为是不良实践,因为它可能会掩盖异常。另一篇答案中描述的堆栈跟踪方法几乎肯定是您想要的。 try是原始catch功能的扩展;如果使用它,您需要为每个要捕获的异常类型指定子句,并适当地处理它们。有关详细信息和清晰的示例,请参见Erlang参考手册的6.18/6.19节。

2
仅使用catch通常被认为是不好的形式。如果您不知道要捕获每个异常,那么您可能不需要它。它可能会使一些错误更难以发现。 - Adam Lindberg
2
@Adam Lindberg:谢谢 - 这可以解释为什么会有 Downvote 。我会编辑我的答案。 - ire_and_curses
非常感谢你们大家!! :) - Francesco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接