为什么第一个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',)))
答案 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
。