Elixir:正确的打印方式 __STACKTRACE__
Elixir: Correct way of printing __STACKTRACE__
我知道我们可以在 elixir 的 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ła 在 official 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
我知道我们可以在 elixir 的 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ła 在 official 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