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
我想做的是 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