2015-11-12 41 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