我对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).
Run Code Online (Sandbox Code Playgroud)
代码编译,但当我运行它,并发送文本请求时,我得到以下错误.
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}]}}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?文档说"catch"语句处理所有错误,或者我必须做些什么来捕获mochijson:decode引发的特定错误.请任何线索或建议都会有所帮助.谢谢.
Ric*_*rdC 19
catch子句"_ - > ..."只捕获'throw'类的异常.为了赶上其他类型的异常,你需要写在表格上的图案"类:期限 - > ..."(即默认级是"扔").在你的情况下:
catch
_:_ -> {"Error! Json is invalid",ReqData,Context}
end
Run Code Online (Sandbox Code Playgroud)
当你这样做时,你应该总是问自己为什么要抓住每一个可能的例外.如果是因为你正在调用你不知道它可能会如何表现的第三方代码,那通常都可以.如果您正在调用自己的代码,请记住您基本上丢弃了有关失败的所有信息,可能会使调试变得更加困难.如果你能缩小它仅捕捉特定预期的情况下,让其他任何异常告吹(所以你看到发生了真正的失败在哪里),那么这样做.