How can I write an exception stack trace in erlang after catching it?

久未见 提交于 2019-12-03 10:27:05
Christian

From Erlang 21.0 onwards, there's a new official way to get the stack trace. An optional pattern match in the try expression on the third parameter in the exception, which will contain the stack trace:

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

Older versions (OTP 20 and below)

For versions of Erlang/OTP 20 and below, you need to use get_stacktrace/0, which allows you to get the stacktrace of the last exception in the calling process:

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

An answer for your question is:

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

The current function is at the head of the list. Read more in man 3erl erlang or erlang:get_stacktrace/0

In your example, you don't need the try; you can just do

result = (catch code_that_fails()).

If an exception is raised, catch returns a tuple that contains the error code and stack trace.

Note that this is generally considered bad practice as it can mask exceptions. The stacktrace approach described in another answer is almost certainly what you want.

try is an extension of the original catch functionality; if you use it, you need to specify clauses for each exception type you would like to catch, and handle them appropriately. See sections 6.18/6.19 of the Erlang reference manual for details and clear examples.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!