Обработка ошибок Erlang inets http-клиента - PullRequest
0 голосов
/ 24 апреля 2010

У меня есть приложение Erlang, которое выполняет большое количество http-вызовов на внешние сайты, используя inets, используя код ниже

case http:request(get, {Url, []}, [{autoredirect, false}], []) of
{ok, {{_, Code, _}, _, Body}}->
    case Code of
    200 ->
        HandlerFn(Body);
    _ ->
        {error, io:format("~s returned HTTP ~p", [Broker, Code])}
    end;
Response -> %% block to handle unexpected responses from inets
    {error, io:format("~s returned ~p", [Broker, Response])}
end.

Существует явный блок для обработки чего-либо странного, что может вернуть inet [Response]. Несмотря на это, я все еще получаю то, что похоже на отчеты об ошибках inets, сбрасываемые на консоль [пример ниже]. Что я здесь не так делаю? Нужно ли настраивать какой-нибудь обработчик ошибок inets в другом месте?

Спасибо.

-

=ERROR REPORT==== 24-Apr-2010::06:49:47 ===
** Generic server <0.6618.0> terminating 
** Last message in was {connect_and_send,
                           {request,#Ref<0.0.0.139358>,<0.6613.0>,0,http,
                               {"**********",80},
                               "*****************************",
                               [],get,
                               {http_request_h,undefined,"keep-alive",
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,"news.bbc.co.uk",
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,undefined,undefined,
                                   undefined,[],undefined,undefined,undefined,
                                   undefined,"0",undefined,undefined,
                                   undefined,undefined,undefined,undefined,[]},
                               {[],[]},
                               {http_options,"HTTP/1.1",infinity,false,[],
                                   undefined,false,infinity},
                               "************************************",
                               [],none,[],1272088179114,undefined,undefined}}
** When Server state == {state,
                            {request,#Ref<0.0.0.139358>,<0.6613.0>,0,http,
                                {"******************",80},
                                "*****************************",
                                [],get,
                                {http_request_h,undefined,"keep-alive",
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,"news.bbc.co.uk",
                                    undefined,undefined,undefined,undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,[],undefined,undefined,
                                    undefined,undefined,"0",undefined,
                                    undefined,undefined,undefined,undefined,
                                    undefined,[]},
                                {[],[]},
                                {http_options,"HTTP/1.1",infinity,false,[],
                                    undefined,false,infinity},
                                "****************************************",
                                [],none,[],1272088179114,undefined,undefined},
                            undefined,undefined,undefined,undefined,undefined,
                            {[],[]},
                            {[],[]},
                            undefined,[],nolimit,nolimit,
                            {options,
                                {undefined,[]},
                                0,2,5,120000,2,disabled,false,inet,default,
                                default,[]},
                            {timers,[],undefined},
                            httpc_manager,undefined}
** Reason for termination == 
** {error,{connect_failed,{#Ref<0.0.0.139358>,{error,nxdomain}}}}

=ERROR REPORT==== 24-Apr-2010::06:49:47 ===
HTTPC-MANAGER<httpc_manager> handler (<0.6618.0>, started) failed to connect and/or send request #Ref<0.0.0.139358>
   Result: {error,{connect_failed,{#Ref<0.0.0.139358>,{error,nxdomain}}}}

Ответы [ 4 ]

1 голос
/ 24 апреля 2010

Для каждого http-запроса, который вы делаете, отдельный процесс httpc_handler создается «внутри». Этот процесс сначала пытается открыть сокет для желаемого домена. В этом случае домен не существует, поэтому открытие сокета завершается неудачно. В результате порожденный процесс решает остановиться.

Поскольку процесс-обработчик написан в соответствии с принципами gen_server, ваш обработчик ошибок сбросит последнее состояние процесса умирания. Вы ничего не могли или не могли с этим поделать.

0 голосов
/ 26 апреля 2010

HTTP-клиент inets имеет довольно противоречивый интерфейс. Я бы предложил использовать lhttpc .

0 голосов
/ 25 апреля 2010

Если ваше приложение следует формату OTP, тогда супервизор, обрабатывающий процесс inets, должен быть настраиваемым для перезапуска процесса. Процессы сбоя «нормальны» для приложения erlang, и в дереве супервизора есть множество способов справиться с ситуацией.

Лукас был прав в том, что SASL просто сообщает о факте сбоя процесса. Это предотвращает вызов вашего обратного вызова, поэтому он не может обработать сбой. На самом деле он не может обработать сбой, поскольку он зависит от вызова вызывающего процесса.

Не видя, как запускается ваш процесс inets и код, который делает вызов Трудно советовать вам больше, чем просто сказать, что подходящее место для обработки сбоя находится в вашем дереве супервизора. Я бы посоветовал прочитать документацию Erlang System Design: http://www.erlang.org/doc/design_principles/users_guide.html, чтобы понять, как процессы erlang предназначены для использования и обработки.

0 голосов
/ 24 апреля 2010

Я предполагаю, что http создает новый процесс, который умирает с nxdomain. Этот аварийный сасл поднимается и печатается в скорлупе.

...