如何处理牛仔websocket处理程序中的异常?

时间:2013-11-11 06:49:45

标签: json websocket erlang cowboy

我试图在牛仔websocket处理程序中使用jiffy解析它时捕获无效的json。如果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 [错误] Ranch listener http有连接过程&lt; 0.523.0&gt;退出原因:{{try_clause,{{[{&lt;&lt;“register”&gt;&gt;,&lt;&lt;“my-channel”&gt;&gt;}]},{http_req,#Port&lt; 0.1337&gt; ,ranch_tcp,存活,和LT; 0.523.0&GT;,&LT;&LT; “GET” &GT;&GT;, 'HTTP / 1.1',{{127,0,0,1},34869},&LT;&LT;“127.0 .0.1 “&GT;&GT;,未定义,3000,&LT;&LT;”/网页套接字/ “&GT;&GT;,未定义&LT;&LT;&GT;&GT;,未定义[],[{&LT;&LT;” 升级“&GT;&GT;,&LT;&LT;” 的WebSocket “&GT;&GT;},{&LT;&LT;” 连接 “&GT;&GT;,&LT;&LT;” 升级“&GT;&GT;},{&LT;&LT; “宿主” &GT;&GT;,&LT;&LT; “127.0.0.1:3000” &GT;&GT;},{&LT;&LT; “原点” &GT;&GT;,&LT;&LT; “http://localhost:4000” &GT ;&GT;},{&LT;&LT; “编译” &GT;&GT;,&LT;&LT; “无缓存” &GT;&GT;},{&LT;&LT; “缓存控制” &GT;&GT;,&LT; &LT; “无缓存” &GT;&GT;},{&LT;&LT; “仲WebSocket的密钥” &GT;&GT;,&LT;&LT; “ueSRxsIc4wM7KdGnyhJOhw ==” &GT;&GT;},{&LT;&LT; “仲WebSocket的版本” &GT;&GT;,&LT;&LT; “13” &GT;&GT;},{&LT;&LT; “仲WebSocket的扩展” &GT;&GT;,&LT;&LT;“X-webkit的-deflate-frame“&gt;&gt;},{&lt;&lt;”user-agent“&gt;&gt;,&lt;&lt;”Mozilla / 5.0(X11; Linux i686(x86_64))AppleWebKit / 537.36(KHTML,l ike Gecko)Chrome / 30.0.1599.114 Safari / 537.36“&gt;&gt;}],[{&lt;&lt;”sec-websocket-extensions“&gt;&gt;,[{&lt;&lt;”x-webkit-deflate-帧 “&GT;&GT;,[]}]},{&LT;&LT;” 升级 “&GT;&GT;,并[d&LT;” 的WebSocket “&GT;&GT;]},{&LT;&LT;” 连接“&GT ;&GT;,并[d&LT; “升级” &GT;&GT;]}],未定义,[{websocket_compress,FALSE},{websocket_version,13}],等待,未定义&LT;&LT;&GT;&GT;,假,完成,[],&LT;&LT;&GT;&GT;,未定义},undefined_state}},[{cowboy_websocket,handler_call,7,[{文件, “SRC / cowboy_websocket.erl”},{线,598}]} {cowboy_protocol,执行,如图4所示,[{文件, “SRC / cowboy_protocol.erl”},{线,529}]}]}

那我该怎么做呢?

1 个答案:

答案 0 :(得分: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}.