Python中ProxyError与OSError异常处理失败求助
解决ProxyError和OSError捕获失败的问题
嘿,我来帮你排查下为啥你的异常捕获没生效~ 看了你的代码,我发现几个关键问题,咱们一步步来解决:
1. 根本没触发ProxyError的前提:你没配置代理啊!
ProxyError只有在你使用代理请求且代理连接出问题的时候才会抛出。你的代码里不管是session还是get请求都没设置proxies参数,那程序根本不会碰到代理相关的异常,自然捕获不到啦。
2. 语法错误(Python3环境下)
你的print 'OSError'是Python2的写法,Python3里必须加括号写成print('OSError'),不然会先报SyntaxError,程序直接挂掉,连异常捕获的逻辑都走不到。
3. 异常捕获顺序搞反了
ProxyError是ConnectionError的子类,而在Python3中,requests的请求异常最终会继承自OSError。如果你先写except OSError,那所有子类异常(包括ProxyError)都会被这个通用的except块接住,后面的ProxyError捕获逻辑就永远不会执行了。正确的顺序应该是先捕获具体的小异常,再捕获通用的大异常。
修正后的完整代码
import requests import time from requests.exceptions import ProxyError, SSLError, ConnectionError class YourProxyClass: def __init__(self): # 初始化session self.session = requests.Session() # 配置你的代理(替换成真实的代理地址) self.proxies = { 'http': 'http://your-proxy-address:port', 'https': 'https://your-proxy-address:port' } def adding(self): headers={ 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36' } url = 'https://your-target-url.com' # 替换成你的目标URL # 必须传入proxies参数,才会触发代理相关异常 r = self.session.get(url, headers=headers, proxies=self.proxies) # 加上这个,把HTTP 4xx/5xx错误也转换成异常 r.raise_for_status() def run(self): while True: try: self.adding() except ProxyError as err: print(f'ProxyError触发了: {str(err)}') except SSLError as err: print(f'SSLError触发了: {str(err)}') except ConnectionError as err: print(f'ConnectionError触发了: {str(err)}') except OSError as err: print(f'OSError触发了: {str(err)}') # 加个休眠,避免循环太频繁 time.sleep(2) # 测试用例 if __name__ == '__main__': obj = YourProxyClass() obj.run()
额外提示
- 要测试ProxyError,你可以故意填一个无效的代理地址,比如随便写个不存在的端口,这样请求时就会触发ProxyError了。
r.raise_for_status()很重要,默认情况下requests返回404、500这类状态码不会抛出异常,加上这个可以把HTTP错误也纳入异常捕获范围。
内容的提问来源于stack exchange,提问作者Mister




