如何在Erlang中使用try / catch

t0ybt7op  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(264)

我对erlang还是个新手,我正在尝试使用一个基本的try / catch语句。我正在使用webmachine来处理一些请求,我真正想做的是解析一些JSON数据并返回它。如果JSON数据无效,我只想返回一个错误消息。下面是我目前拥有的代码。
(the 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抛出的特定错误。请提供任何线索或建议将是有帮助的。谢谢。

yhived7q

yhived7q1#

catch子句_ -> ...只捕获'throw'类的异常。要捕获其他类型的异常,您需要以Class:Term -> ...的形式编写一个模式(即,默认的Classthrow)。在您的示例中:

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

当你这样做的时候,你应该经常问自己 * 为什么 * 你要捕捉每一个可能的异常。如果是因为你调用了第三方代码,而你不知道它可能会如何表现,这通常是可以的。如果你调用了你自己的代码,记住你基本上是在丢弃所有关于失败的信息,这可能会使调试变得更加困难。如果你能把范围缩小到只捕捉特定的预期情况,而让任何其他异常都掉进去(这样你就能看到真实的失败发生的地方),那么就这样做吧。

相关问题