Fra*_*sco 16 erlang stack exception
假设我有这样的事情:
try code_that_fails()
catch _:_ -> .....
Run Code Online (Sandbox Code Playgroud)
如何在catch块中打印stacktrace?该块捕获所有异常,但我不知道如何打印堆栈...
你能帮助我吗?
Chr*_*ian 27
从Erlang 21.0开始,有一种新的官方方式来获得堆栈跟踪.try例子中的可选模式匹配异常中的第三个参数,它将包含堆栈跟踪:
try
code_that_fails()
catch
_:_:Stacktrace ->
erlang:display(Stacktrace)
end
Run Code Online (Sandbox Code Playgroud)
对于Erlang/OTP 20及更低版本的版本,您需要使用get_stacktrace/0,它允许您获取调用进程中最后一个异常的堆栈跟踪:
try
code_that_fails()
catch
_:_ ->
erlang:display(erlang:get_stacktrace())
end
Run Code Online (Sandbox Code Playgroud)
你的问题的答案是:
io:format("Backtrace ~p~n", [erlang:get_stacktrace()])
Run Code Online (Sandbox Code Playgroud)
当前功能位于列表的首位.阅读更多man 3erl erlang或者erlang:get_stacktrace/0
在您的示例中,您不需要try; 你可以做
result = (catch code_that_fails()).
Run Code Online (Sandbox Code Playgroud)
如果引发异常,则catch返回一个包含错误代码和堆栈跟踪的元组 。
请注意,这通常被认为是不好的做法,因为它可以掩盖异常。另一个答案中描述的stacktrace方法几乎肯定是您想要的。
try是原始catch功能的扩展;如果使用它,则需要为要捕获的每种异常类型指定子句,并进行适当处理。有关详细信息和清晰示例,请参见《Erlang参考手册》的 6.18 / 6.19部分。
| 归档时间: |
|
| 查看次数: |
7428 次 |
| 最近记录: |