erlang:get_stacktrace注意避开的坑

今天用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链接了,,,复制出来就乱码,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值