首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Erlang inets http客户端错误

处理Erlang inets http客户端错误
EN

Stack Overflow用户
提问于 2010-04-24 14:28:46
回答 4查看 2.2K关注 0票数 1

我有一个Erlang应用程序,它使用inets对外部站点进行大量的http调用,使用以下代码

代码语言:javascript
复制
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错误处理程序?

谢谢。

--

代码语言:javascript
复制
=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}}}}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-24 16:02:46

对于您发出的每个http请求,都会在“内部”产生一个单独的httpc_handler进程。此进程首先尝试打开通向所需域的套接字。在这种情况下,该域不存在,因此打开套接字失败。因此,衍生的进程决定停止。

因为处理程序进程是根据gen_server原则编写的,所以错误处理程序将刷新即将结束的进程的最后状态。对此你无能为力,也无能为力。

票数 1
EN

Stack Overflow用户

发布于 2010-04-24 19:49:37

我猜想http创建了一个新的进程,它以nxdomain结束。这个crash sasl可以在shell中拾取和打印。

票数 0
EN

Stack Overflow用户

发布于 2010-04-25 09:09:00

假设你的应用程序遵循OTP的格式,那么处理inets进程的主管应该是可配置的,以重新启动进程。对于erlang应用程序来说,进程崩溃是“正常的”,在supervisor树中有各种方法来处理这种情况。

Lukas是对的,SASL只是报告了进程崩溃的事实。这可以防止你的回调被调用,所以它不能处理崩溃。事实上,它不能处理崩溃,因为它特别依赖于崩溃的进程的调用。

如果看不到inets进程是如何启动的,也看不到进行调用的代码,就很难给出建议,就像说处理崩溃的合适位置在您的supervisor树中一样。我建议阅读Erlang系统设计文档:http://www.erlang.org/doc/design_principles/users_guide.html,以了解如何使用和处理erlang流程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2703466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档