2015-11-12 39 views
2

带连接池的python请求(urllib3)不捕获http错误。这是一个错误?或者我做错了什么?python requests/urllib3连接池不捕获HTTP错误

#!/usr/bin/env python 

import contextlib 
import requests 
import sys 

connection_pool_size = 2 
adapter = requests.adapters.HTTPAdapter(pool_connections=connection_pool_size, 
             pool_maxsize=connection_pool_size) 
r_session = requests.Session() 
r_session.mount('http', adapter) 

try: 
    with contextlib.closing(r_session.get(sys.argv[1], timeout=30, allow_redirects=True)) as r: 
     print 'success %r' % r 
except requests.exceptions.HTTPError as e: 
    print 'HTTPError %r' % e 
except Exception as e: 
    print 'Exception %r' % e 

输出:

$ ./test.py https://github.com 
success <Response [200]> 
$ ./test.py https://github.com/sithlordyoyoma 
success <Response [404]> 

我期待HTTPError。难道我做错了什么?

关闭与contextlib我从这个线程should I call close() after urllib.urlopen()?。正如Alex Martelli所建议的那样。

实际运行没有连接请求也呈现出这种行为

#!/usr/bin/env python 

import contextlib 
import requests 
import sys 


try: 
    with contextlib.closing(requests.get(sys.argv[1], timeout=30, allow_redirects=True)) as r: 
     print 'success %r' % r 
except requests.exceptions.HTTPError as e: 
    print 'HTTPError %r' % e 
except Exception as e: 
    print 'Exception %r' % e 

输出:

$ ./test.py https://github.com 
success <Response [200]> 
$ ./test.py https://github.com/sithlordyoyoma 
success <Response [404]> 

的urllib2这是否正确

#!/usr/bin/env python 

import contextlib 
import urllib2 
import sys 


try: 
    with contextlib.closing(urllib2.urlopen(sys.argv[1], timeout=30)) as r: 
     print 'success %r' % r 
except urllib2.HTTPError as e: 
    print 'HTTPError %r' % e 
except Exception as e: 
    print 'Exception %r' % e 

输出:

$ ./test.py https://github.com 
success <addinfourl at 4338734792 whose fp = <socket._fileobject object at 0x1025a5c50>> 
$ ./test.py https://github.com/sithlordyoyoma 
HTTPError HTTPError() 
+1

'Response.raise_for_status()'可帮帮我?不是一个答案,因为我不明白自己,当你*必须*必须使用它。 – zwol

+1

你为什么期待'HTTPError'? –

+0

404不是HTTPError吗?另外,我正在用404演示。但是,这发生在400,502和503之间。到目前为止,我注意到了这些。 – krafts

回答

0

不管连接池,requests.post(和其他HTTP方法)不会提高对一个404 HTTPErrorHTTPError升高通过调用.raise_for_status(),像这样的示例演示:

#!/usr/bin/env python 

import requests 

r = requests.post(
    'https://github.com/sithlordyoyoma', 
    timeout=30, 
    allow_redirects=True 
) 
print 'success %r' % r 
r.raise_for_status() 
+0

感叹,阅读文档,正确。我期待的行为类似于urllib2。因此造成混乱的根源。 http://docs.python-requests.org/en/latest/api/#requests.Response.raise_for_status – krafts

+0

哦顺便说一句,谢谢@ rob%e1%b5%a9 – krafts