You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中能否将所有Selenium异常统一为单一父异常类型?

统一Selenium异常类用于日志记录的解决方案

方案1:捕获Selenium异常后抛出自定义统一异常

这种方式直接在代码中捕获所有Selenium相关异常,转换为自定义的SeleniumException抛出,日志中会显示统一的异常类型,同时保留原异常的关键信息,方便区分预期与非预期报错。

实现步骤

  1. 定义自定义异常类,包括统一的Selenium异常类和标记预期报错的类
  2. 在爬虫逻辑中捕获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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:25:21