我对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抛出的特定错误。请提供任何线索或建议将是有帮助的。谢谢。
1条答案
按热度按时间yhived7q1#
catch子句
_ -> ...
只捕获'throw'类的异常。要捕获其他类型的异常,您需要以Class:Term -> ...
的形式编写一个模式(即,默认的Class
是throw
)。在您的示例中:当你这样做的时候,你应该经常问自己 * 为什么 * 你要捕捉每一个可能的异常。如果是因为你调用了第三方代码,而你不知道它可能会如何表现,这通常是可以的。如果你调用了你自己的代码,记住你基本上是在丢弃所有关于失败的信息,这可能会使调试变得更加困难。如果你能把范围缩小到只捕捉特定的预期情况,而让任何其他异常都掉进去(这样你就能看到真实的失败发生的地方),那么就这样做吧。