Elixir:正确的打印方式 __STACKTRACE__

Elixir: Correct way of printing __STACKTRACE__

我知道我们可以在 的 catch/rescue 块中使用 __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

只是 Stacktrace

Michał Muskałaofficial elixir github issue 上回答了这个问题:

The canonical way would be to use Exception.format_stacktrace/1

从文档中可以清楚地看出,当仍在 rescue 块内时,我们不需要将 __STACKTRACE__ 作为参数显式传递给方法。使用 Process.info:

自动检索
Logger.error(Exception.format_stacktrace())

完全错误 Stacktrace

Michal 的评论帮助我找到 Exception.format/3,它格式化错误本身 其完整的堆栈跟踪,这似乎更适合我的用例:

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