You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中ProxyError与OSError异常处理失败求助

解决ProxyError和OSError捕获失败的问题

嘿,我来帮你排查下为啥你的异常捕获没生效~ 看了你的代码,我发现几个关键问题,咱们一步步来解决:

1. 根本没触发ProxyError的前提:你没配置代理啊!

ProxyError只有在你使用代理请求且代理连接出问题的时候才会抛出。你的代码里不管是session还是get请求都没设置proxies参数,那程序根本不会碰到代理相关的异常,自然捕获不到啦。

2. 语法错误(Python3环境下)

你的print 'OSError'是Python2的写法,Python3里必须加括号写成print('OSError'),不然会先报SyntaxError,程序直接挂掉,连异常捕获的逻辑都走不到。

3. 异常捕获顺序搞反了

ProxyErrorConnectionError的子类,而在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

火山引擎 最新活动