未捕获Python请求代理错误

未捕获Python请求代理错误,python,Python,为什么代理错误不会被第一个except:子句捕获?我不太明白为什么它会违反第二条(或者如果我删除第二个原因,它只会抛出一个错误) 输出: 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 For

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

输出:

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',)))

你在这里碰到了一个边缘案件。
ProxyError
异常实际上不是
请求;它是嵌入的
urllib3
库中的同名异常,并封装在
MaxRetryError
异常中

这确实是一个bug,而且确实是在不久前提交的,请参见。已通过修复,以引发正确的
请求。异常。ProxyError
异常。此修复程序已作为请求2.9.2的一部分发布

通常,
请求
为您打开
MaxRetryError
异常,但不针对此特定异常。如果您无法升级到2.9.2或更高版本,您可以专门捕获它(现在展开两层):


或者将拉取请求的更改应用到本地安装的
请求

谁是登录和acc?你能发布完整的代码吗?@gplayer:这里不需要,如果你熟悉
请求
代码库,这里发生的事情就很清楚了。OP希望
ProxyError
捕获异常,但是
exception
分支触发,
print e
生成显示的输出。我明白了,看起来我对这些还不够熟悉:)谢谢!回答得很好,希望其他人也能在这里找到帮助。我认为实际上需要捕获外部的requests.ConnectionError(如果您查看异常的层次结构)
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',)))
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