Ответ 1
См. get_stacktrace/0, которые позволяют вам получить стек из последнего исключения в вызывающем процессе.
try
code_that_fails()
catch
_:_ ->
erlang:display(erlang:get_stacktrace())
end
Предположим, что у меня есть что-то вроде этого:
try code_that_fails()
catch _:_ -> .....
Как распечатать stacktrace в блоке catch? Этот блок ловит все исключения, но я не знаю, как распечатать стек...
Можете ли вы мне помочь?
См. get_stacktrace/0, которые позволяют вам получить стек из последнего исключения в вызывающем процессе.
try
code_that_fails()
catch
_:_ ->
erlang:display(erlang:get_stacktrace())
end
В вашем примере вам не нужен try
; вы можете просто сделать
result = (catch code_that_fails()).
Если возникает исключение, catch
возвращает кортеж, содержащий код ошибки и трассировку стека.
Обратите внимание, что это обычно считается плохой практикой, поскольку он может маскировать исключения. Метод stacktrace, описанный в другом ответе, почти наверняка вы хотите.
try
является расширением исходной функциональности catch
; если вы его используете, вам нужно указать предложения для каждого типа исключений, которые вы хотели бы поймать, и обрабатывать их соответствующим образом. Подробнее и четкие примеры см. В разделах 6.18/6.19 справочника Erlang.
Ответ на ваш вопрос:
io:format("Backtrace ~p~n", [erlang:get_stacktrace()])
Текущая функция находится во главе списка. Подробнее в man 3erl erlang
или erlang: get_stacktrace/0