pycurl在异常后恢复

时间:2015-10-16 15:41:41

标签: python pycurl

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

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 我的回溯看起来像这样并停止执行:

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()但结果相同。

>>> 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

2 个答案:

答案 0 :(得分:0)

你有return None除了退出你的功能,通行证也可以删除。将except pycurl.error:替换为except:会发现任何错误。

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

答案 1 :(得分:0)

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

c.setopt(pycurl.FAILONERROR, 1)

更改为:

c.setopt(pycurl.FAILONERROR, 0)

我使用您的代码对此进行了测试,这只是一个小小的忽视。

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

我在FAILONERROR找到的有关$getlastday = cal_days_in_month(CAL_GREGORIAN, 05, 2018); $endMonth = date('2018-05-'.$getlastday); $dayPostition = date('w', strtotime($endMonth)); 的更多信息:http://manpages.ubuntu.com/manpages/xenial/man3/tclcurl.3.html#contenttoc7

  

来自文档:

     

failonerror                 如果HTTP,1参数告诉扩展无提示失败                 返回的代码等于或大于400.默认操作                 将是正常返回页面,忽略该代码。

     

此方法不是故障安全的,并且有时候非                 成功的响应代码将会漏掉,特别是在                 涉及认证(响应代码401和407)。

     

在此之前,您可能会收到一些转移的标头                 检测到情况,就像“100-continue”的情况一样                 作为对POST / PUT的响应而收到的是401或407                 之后立即收到。