首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常后恢复pycurl

异常后恢复pycurl
EN

Stack Overflow用户
提问于 2015-10-16 23:41:41
回答 2查看 879关注 0票数 1

我已经用bottle创建了一个‘ve服务,并将其用作JSON接口。该例程在检查URL的有效性和http_code时收集信息。

代码语言:javascript
复制
def get_statuscode(url):
    c = pycurl.Curl()
    c.setopt(pycurl.URL, "http://"+url)
    c.setopt(pycurl.SSL_VERIFYPEER, 0)
    c.setopt(pycurl.FOLLOWLOCATION, 1)
    c.setopt(pycurl.HEADER, 1)
    c.setopt(pycurl.NOBODY, 1)
    c.setopt(pycurl.FAILONERROR, 1)
    #c.setopt(pycurl.E_)
    try:
        c.perform()
    except pycurl.error:
        print "MUH"
        return None
        pass
    temp = c.getinfo(pycurl.HTTP_CODE)
    c.close()
    return temp

在函数被赋予一个真正错误的url后,我如何恢复操作:例如google.local,我的回溯看起来像这样,并停止执行:

代码语言:javascript
复制
In[46]: misc.get_statuscode("google.local")
Traceback (most recent call last):
  File "PATH\Python\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-46-c47028d49dc0>", line 1, in <module>
    misc.get_statuscode("google.local")
  File "PATH\ops\misc.py", line 12, in get_statuscode
    c.setopt(pycurl.FOLLOWLOCATION, 1)
error: (6, "Couldn't resolve host 'google.local'")

甚至尝试过socket.gethostbyname_ex(),但结果是一样的。

代码语言:javascript
复制
>>> socket.gethostbyname_ex("google.local")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known
EN

回答 2

Stack Overflow用户

发布于 2018-04-26 12:58:25

我知道这很古老,但我相信答案就是这样

代码语言:javascript
复制
c.setopt(pycurl.FAILONERROR, 1)

更改为:

代码语言:javascript
复制
c.setopt(pycurl.FAILONERROR, 0)

我用你的代码测试过了,这只是一个小小的疏忽。

问题是,当它被设置为1时,它被指示对错误进行保释。

我在这里找到了更多关于FAILONERROR的信息:http://manpages.ubuntu.com/manpages/xenial/man3/tclcurl.3.html#contenttoc7

文档中的

如果返回的HTTP代码等于或大于400,则failonerror A 1参数通知扩展静默失败。默认操作是正常返回页面,忽略该代码。

这种方法不是故障安全的,有时不成功的响应代码会漏掉,特别是在涉及身份验证时(响应代码401和407)。

在检测到这种情况之前,您可能会收到一定数量的报头传输,例如,当收到"100-continue“作为对POST/PUT的响应时,然后立即收到401或407。

票数 1
EN

Stack Overflow用户

发布于 2015-10-16 23:50:19

除了退出你的函数之外,你还有return None,这个过程也可以被丢弃。用except:替换except pycurl.error:将捕获任何错误。

代码语言:javascript
复制
def get_statuscode(url):
    c = pycurl.Curl()
    c.setopt(pycurl.URL, "http://"+url)
    c.setopt(pycurl.SSL_VERIFYPEER, 0)
    c.setopt(pycurl.FOLLOWLOCATION, 1)
    c.setopt(pycurl.HEADER, 1)
    c.setopt(pycurl.NOBODY, 1)
    c.setopt(pycurl.FAILONERROR, 1)
    #c.setopt(pycurl.E_)
    try:
        c.perform()
    except:
        print "MUH"
    temp = c.getinfo(pycurl.HTTP_CODE)
    c.close()
    return temp
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33174476

复制
相关文章

相似问题

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