今天用rebar3编译代码的时候抛了个错:src/riak_sysmon_filter.erl:383: Warning: erlang:get_stacktrace/0 is deprecated and will be removed in OTP 24; use use the new try/catch syntax for retrieving the stack backtrace
百度了一波发现:
erlang:get_stacktrace()会在OTP 21中把它废弃掉,正确的用法
erlang:get_stacktrace/0 is deprecated in OTP 21, you can use the following expression instead:
try Expr
catch
Class:Reason:Stacktrace ->
{Class,Reason,Stacktrace}
end
之前在使用erlang:get_stacktrace()函数的时候发现不能正确的获取发生异常的栈内容,但是错误类型和原因却是正常,感觉非常奇怪,下面是具体的代码:
dispatch_cmd(User, Mod, Msg) ->
try Mod:req(User, Msg) of
Result ->
Result
catch
Class:Reason ->
monitor:notify(ws_dispatch_crash, io_lib:format("<error-info: ~p:req ~p:~p>", [Mod, Class, Reason])),
?ERROR("Req Msg: ~p.~nStacktrace: ~s", [?PR(Msg), ?PR_ST(erlang:get_stacktrace(), {Class, Reason})]),
?ERR_AT_DISPATCH_CMD
end.
上面的代码有什么问题呢? 主要的问题是在调用erlang:get_stacktrace()之前执行了其他有可能会有异常捕获的语句,而在io_lib:format里面会有catch函数,如果io_lib:format函数里面的catch被调用的话,erlang:get_stacktrace()返回的就不是我们想要打印的异常栈,而是io_lib:format里面的异常栈。 如何解决? 在catch之后里面立马调用erlang:get_stacktrace()
dispatch_cmd(User, Mod, Msg) ->
try Mod:req(User, Msg) of
Result ->
Result
catch
Class:Reason ->
Stacktrace = erlang:get_stacktrace(),
monitor:notify(ws_dispatch_crash, io_lib:format("<error-info: ~p:req ~p:~p>", [Mod, Class, Reason])),
?ERROR("Req Msg: ~p.~nStacktrace: ~s", [?PR(Msg), ?PR_ST(Stacktrace, {Class, Reason})]),
?ERR_AT_DISPATCH_CMD
end.
原文链接:https://lintingbin2009.github.io/2018/03/29/%E4%BD%BF%E7%94%A8erlang-get-stacktrace%E6%B3%A8%E6%84%8F%E9%81%BF%E5%BC%80%E7%9A%84%E5%9D%91/
ps:博主把中文写到url链接了,,,复制出来就乱码,