如何让try/catch在erlang中工作

如何让try/catch在erlang中工作,erlang,try-catch,Erlang,Try Catch,我是erlang的新手,我正在尝试使用一个基本的try/catch语句。我正在使用webmachine处理一些请求,我真正想做的就是解析一些JSON数据并返回它。如果JSON数据无效,我只想返回一个错误消息。这是我到目前为止的代码 (JSON数据无效) 代码可以编译,但当我运行它并发送文本请求时,返回以下错误 error,{error,{case_clause,{{const,"lastName"}, ": \"Smith\"}",

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

(JSON数据无效)

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

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抛出的特定错误。
请提供任何线索或建议。谢谢。

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

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

当你这样做的时候,你应该总是问自己,为什么你要捕捉每一个可能的异常。如果是因为你在调用第三方代码,你不知道它可能会如何运行,这通常是正常的。如果你在调用你自己的代码,请记住,你基本上是在扔掉所有关于失败的信息,可能会导致大量调试更困难。如果您可以将其缩小到只捕获特定的预期情况,并让任何其他异常通过(这样您就可以看到真正的失败发生在哪里),那么就这样做。

@RichardC如何使用try-catch并同时打印堆栈跟踪?@coffeMug如果您调用erlang:get_-stacktrace(),您将获得最新捕获的异常的跟踪,然后您可以打印该异常。但请先阅读。现在,您可以编写
捕获错误类型:ErrorReason:Stacktrace
以获取堆栈跟踪。
catch
  _:_ -> {"Error! Json is invalid", ReqData, Context}
end