Эликсир: правильный способ печати __STACKTRACE__

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

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 ответ

Решение

Просто 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
Другие вопросы по тегам