0

我想要做的是mochijson2:decode(Ccode)生成任何異常或錯誤,程序執行不應該停止並且應該執行case branch {error,Reason}。Erlang中的異常處理繼續執行

但是,當我試圖讓它實現時,它會在第一行生成錯誤,而檢查並且代碼不會繼續執行下面的行。

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來說是新手。任何幫助表示讚賞。

回答

1

似乎是mochijson2:decode/1中發生異常的原因。該函數不會將錯誤作爲元組返回,而是會導致進程崩潰。沒有足夠的信息來說明究竟是什麼原因。不過我猜想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, 
+0

作品完美 –

1

您可以使用此:

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 
+0

完美。 –