Elixir:正确的打印方式__STACKTRACE__



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

米夏·马斯卡在官方长生不老药github问题上回答了这个问题:

规范的方法是使用Exception.format_stacktrace/1

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

Logger.error(Exception.format_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

最新更新