Эликсир: правильный способ печати __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