如何让try / catch在erlang中工作

时间:2010-12-10 19:43:11

标签: erlang try-catch

我对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引发的特定错误。 请任何线索或建议都会有所帮助。感谢。

1 个答案:

答案 0 :(得分:18)

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

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

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

相关问题