我怎么能写在二郎山异常堆栈跟踪捕获它之后?(How can I write an exception

2019-08-02 16:17发布

假设我有这样的事情:

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

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

你能帮助我吗?

Answer 1:

从二郎21.0起,有获得堆栈跟踪新的官方途径。 一个可选的模式匹配在尝试表达在异常的第三个参数,其中将包含堆栈跟踪:

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

旧版本(OTP 20及以下)

对于二郎/ OTP 20以下的版本,你需要使用get_stacktrace / 0 ,它可以让你获得调用进程的最后一个异常的堆栈跟踪:

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


Answer 2:

你的问题的回答是:

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

目前的功能是在列表的头部。 更多的man 3erl erlang或二郎:get_stacktrace / 0



Answer 3:

在你的榜样,你不需要try ; 你可以做

result = (catch code_that_fails()).

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

请注意,这通常被认为是不好的做法,因为它可以掩盖例外。 在另一个答案中所描述的堆栈跟踪方法几乎可以肯定是你想要的。

try是原始的扩展catch功能; 如果你使用它,你需要为你想捕捉到每一个异常类型指定条款,并适当地处理它们。 见部分的6.18 / 6.19 的Erlang参考手册的详细信息和明确的例子。



文章来源: How can I write an exception stack trace in erlang after catching it?