未捕获Python请求ProxyError

时间:2016-04-28 08:51:02

标签: python

为什么第一个except ::子句不会捕获代理错误?我不太明白为什么它违反第二个条款(或者如果我删除第二个原因它只会抛出错误)

from requests.exceptions import ProxyError

try:
    login(acc)
except ProxyError:
    pass
except Exception as e:
    print e

输出:

HTTPSConnectionPool(host='www.google.com', port=443): Max retries exceeded with url: /mail (Caused by ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 403 Forbidden',)))

1 个答案:

答案 0 :(得分:6)

你在这里遇到了一些边缘情况。 ProxyError例外实际上不是requests.exceptions例外;它是嵌入式urllib3库中具有相同名称的异常,它包含在MaxRetryError异常中。

这确实是一个错误,并且确实是在不久前提交的,请参阅issue #3050。它已使用this pull request修复,以提升正确的requests.exceptions.ProxyError例外。此修订已作为请求2.9.2的一部分发布。

通常情况下,requests为您解开MaxRetryError例外,但不会针对此特定例外。如果您无法升级到2.9.2或更高版本,您可以专门捕捉它(现在解开两层):

from requests.exceptions import ConnectionError
from requests.packages.urllib3.exceptions import MaxRetryError
from requests.packages.urllib3.exceptions import ProxyError as urllib3_ProxyError

try:
    # ...
except ConnectionError as ce:
    if (isinstance(ce.args[0], MaxRetryError) and
        isinstance(ce.args[0].reason, urllib3_ProxyError)):
       # oops, requests should have handled this, but didn't.
       # see https://github.com/kennethreitz/requests/issues/3050
       pass

或将拉取请求中的更改应用于本地安装的requests