Как я могу написать трассировку стека исключений в erlang после его перехвата? - PullRequest
15 голосов
/ 26 августа 2009

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

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

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

Вы можете мне помочь?

Ответы [ 3 ]

24 голосов
/ 26 августа 2009

Начиная с 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
5 голосов
/ 26 августа 2009

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

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

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

5 голосов
/ 26 августа 2009

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

result = (catch code_that_fails()).

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

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

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

...