【问题标题】:How to get try / catch to work in erlang如何让try / catch在erlang中工作
【发布时间】:2020-10-09 21:40:55
【问题描述】:

我对 erlang 很陌生,我正在尝试让一个基本的 try/catch 语句起作用。我正在使用 webmachine 处理一些请求,我真正想做的就是解析一些 JSON 数据并返回它。如果 JSON 数据无效,我只想返回一个错误消息。这是我的代码到目前为止。

(JSON数据无效)

to_text(ReqData, Context) ->    
    Body =  "{\"firstName\": \"John\"\"lastName\": \"Smith\"}",
    try decode(Body) of
  _ -> {"Success! Json decoded!",ReqData,Context}
 catch
  _ -> {"Error! Json is invalid",ReqData,Context}
 end.         


decode(Body) ->
  {struct, MJ} = mochijson:decode(Body).

代码可以编译,但是当我运行它并发送文本请求时,我收到以下错误。

error,{error,{case_clause,{{const,"lastName"},
                            ": \"Smith\"}",
                            {decoder,utf8,null,1,31,comma}}},
              [{mochijson,decode_object,3},
               {mochijson,json_decode,2},
               {webmachine_demo_resource,test,1},
               {webmachine_demo_resource,to_text,2},
               {webmachine_demo_resource,to_html,2},
               {webmachine_resource,resource_call,3},
               {webmachine_resource,do,3},
               {webmachine_decision_core,resource_call,1}]}}

我到底做错了什么?文档说“catch”语句处理所有错误,或者我必须做一些事情来捕获 mochijson:decode 抛出的特定错误。 请任何线索或建议都会有所帮助。谢谢。

【问题讨论】:

    标签: erlang try-catch


    【解决方案1】:

    catch 子句_ -> ... 仅捕获“throw”类的异常。要捕获其他类型的异常,您需要在 Class:Term -> ... 形式上编写模式(即,默认的 Classthrow)。在你的情况下:

    catch
      _:_ -> {"Error! Json is invalid", ReqData, Context}
    end
    

    当你这样做时,你应该总是问自己为什么你会捕捉到每一个可能的异常。如果是因为您正在调用第三方代码而您不知道它的行为方式,那通常是可以的。如果您正在调用自己的代码,请记住您基本上丢弃了有关失败的所有信息,这可能会使调试变得更加困难。如果您可以将范围缩小到仅捕获特定的预期情况并让任何其他异常发生(这样您就可以看到真正的失败发生在哪里),那么就这样做。

    【讨论】:

    • @RichardC 如何使用 try catch 并同时打印堆栈跟踪?
    • @coffeMug ​​如果您调用 erlang:get_stacktrace(),您将获得最新捕获的异常的跟踪,然后您可以打印它。但请先阅读erlang.org/pipermail/erlang-questions/2013-November/075928.html
    • 现在,您可以编写catch ErrorType:ErrorReason:Stacktrace 来获取堆栈跟踪。
    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多