Эликсир: правильный способ печати __STACKTRACE__ - PullRequest
0 голосов
/ 03 декабря 2018

Я знаю, что мы можем получить полную трассировку стека, используя __STACKTRACE__ в блоке catch / rescue в , но как правильно его распечатать?В моем случае я спасаюсь от ошибки, но все еще хочу записать ее на консоль.Вот что я сейчас делаю:

def unreliable_method(item) do
  # Do something with `item`
  :ok
rescue
  _err ->
    Logger.error("Failed for item: #{inspect(item)}")
    Logger.error(inspect(__STACKTRACE__))
    {:error, :processing_failed}
end

1 Ответ

0 голосов
/ 03 декабря 2018

Just Stacktrace

На этот вопрос ответил Михал Мускала об официальном выпуске elixir github :

Канонический путьчтобы использовать Exception.format_stacktrace/1

Из документов ясно, что нам не нужно явно передавать __STACKTRACE__ в качестве аргумента методу, когда он все еще находится внутри rescue блок.Он автоматически восстанавливается с помощью Process.info:

Logger.error(Exception.format_stacktrace())

Полная ошибка и Stacktrace

Комментарий Михала помог мне найти Exception.format/3, который форматирует саму ошибку и ее полную трассировку стека, и это выглядело более подходящим для моего варианта использования:

def unreliable_method do
  # do something
  :ok
rescue
  err ->
    Logger.error(Exception.format(:error, err, __STACKTRACE__))
    {:error, :processing_failed}
end
...