【发布时间】:2010-11-23 01:46:14
【问题描述】:
假设我有这样的事情:
try code_that_fails()
catch _:_ -> .....
如何在 catch 块中打印堆栈跟踪?该块捕获所有异常,但我不知道如何打印堆栈...
你能帮帮我吗?
【问题讨论】:
-
Francesco,如果您对其中一个答案感到满意,请将其标记为正确/满意的答案
假设我有这样的事情:
try code_that_fails()
catch _:_ -> .....
如何在 catch 块中打印堆栈跟踪?该块捕获所有异常,但我不知道如何打印堆栈...
你能帮帮我吗?
【问题讨论】:
您的问题的答案是:
io:format("Backtrace ~p~n", [erlang:get_stacktrace()])
当前函数位于列表的开头。在man 3erl erlang 或erlang:get_stacktrace/0 中阅读更多内容
【讨论】:
从 Erlang 21.0 开始,有一种获取堆栈跟踪的新官方方法。异常中第三个参数的try expression 中的可选模式匹配,其中将包含堆栈跟踪:
try
code_that_fails()
catch
_:_:Stacktrace ->
erlang:display(Stacktrace)
end
对于Erlang/OTP 20及以下的版本,需要使用get_stacktrace/0,可以获取调用过程中最后一个异常的stacktrace:
try
code_that_fails()
catch
_:_ ->
erlang:display(erlang:get_stacktrace())
end
【讨论】:
erlang:get_stack_trace() 返回一个空列表,已弃用。
在您的示例中,您不需要 try;你可以这样做
result = (catch code_that_fails()).
如果引发异常,catch 返回一个包含 error code and stack trace 的元组。
请注意,这通常被认为是不好的做法,因为它可以掩盖异常。另一个答案中描述的堆栈跟踪方法几乎肯定是您想要的。
try 是原始catch 功能的扩展;如果使用它,则需要为要捕获的每种异常类型指定子句,并适当地处理它们。有关详细信息和清晰示例,请参阅Erlang reference manual 的第 6.18/6.19 节。
【讨论】:
catch 通常被认为是错误的形式。如果您不知道要捕获 每个 异常,那么您可能不想要它。它会使一些错误更难找到。