Erlang 中的异常处理以继续执行

Exception handling in Erlang to Continue execution

我想做的是 mochijson2:decode(Ccode) 生成任何异常或错误,程序执行不应该停止并且 case 分支 {error, Reason} 应该被执行。

但是当我试图实现它时,它在检查时在第一行产生错误并且代码不会继续执行它下面的行。

SCustomid = case mochijson2:decode(Ccode) of
  {struct, JsonDataa} -> 
       {struct, JsonData} = mochijson2:decode(Ccode),
       Mvalll = proplists:get_value(<<"customid">>, JsonData),
       Pcustomid = erlang:binary_to_list(Mvalll),
       "'" ++ Pcustomid ++ "'";
  {error, Reason} -> escape_str(LServer, Msg#archive_message.customid)


end,

你可以建议我是否需要使用 Try Catch。我对 Ejabberd 有点经验,但对 Erlang 还是新手。感谢任何帮助。

似乎是 mochijson2:decode/1 发生了异常。该函数不会 return 作为元组的错误,而是进程崩溃。没有足够的信息来说明究竟是什么原因。但是我猜 Ccode 的数据格式可能是错误的。您可以使用 try ... catch 语句处理异常:

SCustomid = try
  case mochijson2:decode(Ccode) of
    {struct, JsonDataa} -> 
       {struct, JsonData} = mochijson2:decode(Ccode),
       Mvalll = proplists:get_value(<<"customid">>, JsonData),
       Pcustomid = erlang:binary_to_list(Mvalll),
       "'" ++ Pcustomid ++ "'";
    {error, Reason} -> 
       escape_str(LServer, Msg#archive_message.customid) 
  end   
catch
  What:Reason ->
    escape_str(LServer, Msg#archive_message.customid)
end,

或者只是 catch:

SCustomid = case catch(mochijson2:decode(Ccode)) of
  {struct, JsonDataa} -> 
       {struct, JsonData} = mochijson2:decode(Ccode),
       Mvalll = proplists:get_value(<<"customid">>, JsonData),
       Pcustomid = erlang:binary_to_list(Mvalll),
       "'" ++ Pcustomid ++ "'";
  {error, Reason} -> 
     escape_str(LServer, Msg#archive_message.customid);
  {What, Reason} ->
    escape_str(LServer, Msg#archive_message.customid)
end,

你可以使用这个:

    SCustomid = try
                    {struct, JsonData} = mochijson2:decode(Ccode),
                    Mvalll = proplists:get_value(<<"customid">>, JsonData),
                    Pcustomid = erlang:binary_to_list(Mvalll),
                    "'" ++ Pcustomid ++ "'"
                catch _:_ -> escape_str(LServer, Msg#archive_message.customid)
                end