Как обрабатывать исключения в обработчике cowboy websocket?

Я пытаюсь поймать недействительный json при его анализе с помощью jiffy в обработчике ковбойских веб-сокетов. Если json действителен / недействителен, я хочу переслать соответствующее сообщение websocket_info, которое ответит клиенту. Вот мой код.

websocket_handle({text, Msg}, Req, State) ->

lager:info("Got message ~p",[Msg]),

try  jiffy:decode(Msg) of 

    {[{A,B}]}->{{[{A,B}]},Req,State};

    _->{{invalid,Msg},Req,State}

catch
    _:_->
        {{invalid,Msg},Req,State}
end;

websocket_handle(_Data, Req, State) ->

                 {ok, Req, State}.

websocket_info({[{A,B}]},Req,State) ->

               {reply,{text,jiffy:encode({registered,B})},Req,State};

websocket_info({invalid,Msg},Req,State)->

              {reply,{text,jiffy:encode({error,<<"invalid json">>})},Req,State};

Это вызывает исключение во время выполнения.

12: 07: 48.406 [ошибка] У прослушивателя ранчо http был процесс подключения ‹0.523.0> выход по причине: {{try_clause, {{[{‹<" register ">>, ‹<" my-channel ">>}] }, {http_req, # Port ‹0.1337>, ranch_tcp, keepalive,‹ 0.523.0>, ‹( "GET" >>, 'HTTP / 1.1', {{127,0,0,1}, 34869}, ‹ ‹" 127.0.0.1 ">>, undefined, 3000, ‹<" / websocket / ">>, undefined, ‹< >>, undefined, [], [{‹*" upgrade ">>, ‹<" websocket " >>}, {‹< "соединение" >>, ‹< "Обновить" >>}, {‹*********************************************************************************************************************************************************************************************************************************************************************************** >>, ‹< "_ 3 _" >>}, {‹< "pragma" >>, ‹* "no-cache" >>}, {‹< "cache-control" >>, ‹< "no-cache" >>}, {‹< "sec-websocket-key" >>, ‹< "ueSRxsIc4wM7KdGnyhJOhw ==" >>}, {‹< "sec-websocket-version" >>, ‹< "13" >>}, {‹* "sec-websocket-extensions" >>, ‹< "x-webkit-deflate-frame" >>}, {‹< "user-agent" >>, ‹* "Mozilla / 5.0 (X11; Linux i686 (x86_64)) AppleWebKit / 537.36 (KHTML, например Gecko) Chrome / 30.0.1599.114 Safari / 537.36 ">>}], [{‹*" sec-websocket-extensions ">>, [{‹*" x-webkit- deflate-frame ">>, []}]}, {‹<" upgrade ">>, [‹----------------" websocket ">>]}, {‹<" connection ">>, [‹<" upgrade ">> >> ]}], undefined, [{websocket_compress, false}, {websocket_versio n, 13}], ожидание, undefined, ‹< >>, false, done, [], ‹< >>, undefined}, undefined_state}}, [{cowboy_websocket, handler_call, 7, [{file, "src / cowboy_websocket .erl "}, {line, 598}]}, {cowboy_protocol, execute, 4, [{file," src / cowboy_protocol.erl "}, {line, 529}]}]}

Так как я могу это сделать?


person Akshat Jiwan Sharma    schedule 11.11.2013    source источник


Ответы (1)


Ответ должен быть получен от websocket_handle:

websocket_handle({text, Msg}, Req, State) ->
    lager:info("Got message ~p", [Msg]),
    try jiffy:decode(Msg) of 
        {[{A, B}]}->
            {reply, {text, jiffy:encode({[{registered,B}]})}, Req, State};
        _ -> 
            {reply, {text, jiffy:encode({[{error,<<"invalid json">>}]})}, Req, State} 
    catch
        _:_ ->
            {reply, {text, jiffy:encode({[{error,<<"invalid json">>}]})}, Req, State};
    end;

websocket_handle(_Data, Req, State) ->
    {ok, Req, State}.

websocket_info(_Info, Req, State) ->
    {ok, Req, State}.
person P_A    schedule 11.11.2013
comment
Спасибо. Какая тогда польза от websocket_info? В своих документах они отправляют сообщения о тайм-ауте через websocket_info. - person Akshat Jiwan Sharma; 11.11.2013
comment
websocket_handle предназначен для обработки данных, полученных от клиента, а websocket_info - от системы. github.com/extend/cowboy/blob/master/guide/ws_handlers. мкр. - person P_A; 11.11.2013
comment
Вот что меня смущает. Разве то, что я делал, не было сообщением от системы? - person Akshat Jiwan Sharma; 11.11.2013
comment
Нет, для отправки сообщений следует использовать что-то вроде: self() ! {foo, bar} - person P_A; 11.11.2013
comment
Спасибо, теперь все работает отлично. Одно изменение, которое я хотел бы предложить, - это удалить точку с запятой из последних операторов в try and catch. Он генерирует ошибки времени компиляции - person Akshat Jiwan Sharma; 11.11.2013