Python中能否将所有Selenium异常统一为单一父异常类型?
统一Selenium异常类用于日志记录的解决方案
方案1:捕获Selenium异常后抛出自定义统一异常
这种方式直接在代码中捕获所有Selenium相关异常,转换为自定义的SeleniumException抛出,日志中会显示统一的异常类型,同时保留原异常的关键信息,方便区分预期与非预期报错。
实现步骤
- 定义自定义异常类,包括统一的Selenium异常类和标记预期报错的类
- 在爬虫逻辑中捕获Selenium原生异常,转换为自定义异常抛出
代码示例:
from selenium.common.exceptions import WebDriverException # 自定义统一的Selenium异常类(对应非预期的Selenium报错) class SeleniumException(Exception): pass # 自定义预期异常类(标记你预先定义的正常场景报错,比如数据为空) class ExpectedCrawlException(Exception): pass # 爬虫核心逻辑示例 def run_crawler(driver): try: driver.get("https://target-site.com") # 模拟Selenium操作 target_element = driver.find_element("id", "target-id") # 主动抛出预期异常的场景 if not target_element.text.strip(): raise ExpectedCrawlException("页面目标数据为空,属于预期跳过场景") except WebDriverException as e: # 将所有Selenium原生异常转换为统一异常 raise SeleniumException(f"原异常类型: {type(e).__name__}, 异常信息: {str(e)}") from e
方案2:在日志层统一处理异常显示
如果不想修改原有异常抛出逻辑,可以在日志记录环节做处理,把所有Selenium原生异常的显示名称替换为统一的SeleniumException,同时保留具体异常细节。
代码示例:
import logging from selenium.common.exceptions import WebDriverException # 自定义日志格式化器,修改异常显示格式 class SeleniumLogFormatter(logging.Formatter): def formatException(self, exc_info): exc_type, exc_value, _ = exc_info # 判断是否为Selenium相关异常 if issubclass(exc_type, WebDriverException): return f"SeleniumException: [{exc_type.__name__}] {exc_value}" # 非Selenium异常按原格式处理 return super().formatException(exc_info) # 配置日志处理器 def setup_crawler_logger(): logger = logging.getLogger("crawler_log") logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setFormatter(SeleniumLogFormatter("%(asctime)s - %(levelname)s - %(message)s")) logger.addHandler(handler) return logger # 日志使用示例 logger = setup_crawler_logger() try: # 模拟抛出Selenium异常 from selenium.common.exceptions import NoSuchElementException raise NoSuchElementException("未找到指定元素") except Exception as e: logger.exception("爬虫执行出错")
运行后日志输出示例:
2024-05-20 16:00:00,000 - ERROR - 爬虫执行出错 Traceback (most recent call last): File "test.py", line 26, in <module> raise NoSuchElementException("未找到指定元素") SeleniumException: [NoSuchElementException] 未找到指定元素
关键说明
- 预期/非预期报错区分:用
ExpectedCrawlException标记你定义的正常场景报错,SeleniumException专门对应Selenium抛出的非预期异常,日志中一眼就能区分两类报错。 - 原异常信息保留:两种方案都保留了Selenium原生异常的类型和具体信息,不会丢失排查问题的关键线索。
- 父类捕获覆盖:Selenium的大部分异常(如
NoSuchElementException、InvalidElementStateException)都继承自WebDriverException,直接捕获这个父类就能覆盖绝大多数Selenium相关异常,无需逐个列举。
内容的提问来源于stack exchange,提问作者bogenton
相关产品推荐
相关产品推荐

