我已经用bottle创建了一个‘ve服务,并将其用作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发布于 2018-04-26 12:58:25
我知道这很古老,但我相信答案就是这样
c.setopt(pycurl.FAILONERROR, 1)更改为:
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。
发布于 2015-10-16 23:50:19
除了退出你的函数之外,你还有return None,这个过程也可以被丢弃。用except:替换except pycurl.error:将捕获任何错误。
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 temphttps://stackoverflow.com/questions/33174476
复制相似问题