Как я могу написать трассировку стека исключений в erlang после ее улова?

Предположим, что у меня есть что-то вроде этого:

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

Как распечатать stacktrace в блоке catch? Этот блок ловит все исключения, но я не знаю, как распечатать стек...

Можете ли вы мне помочь?

Ответы

Ответ 1

См. get_stacktrace/0, которые позволяют вам получить стек из последнего исключения в вызывающем процессе.

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

Ответ 2

В вашем примере вам не нужен try; вы можете просто сделать

result = (catch code_that_fails()).

Если возникает исключение, catch возвращает кортеж, содержащий код ошибки и трассировку стека.

Обратите внимание, что это обычно считается плохой практикой, поскольку он может маскировать исключения. Метод stacktrace, описанный в другом ответе, почти наверняка вы хотите.

try является расширением исходной функциональности catch; если вы его используете, вам нужно указать предложения для каждого типа исключений, которые вы хотели бы поймать, и обрабатывать их соответствующим образом. Подробнее и четкие примеры см. В разделах 6.18/6.19 справочника Erlang.

Ответ 3

Ответ на ваш вопрос:

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

Текущая функция находится во главе списка. Подробнее в man 3erl erlang или erlang: get_stacktrace/0