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

如何捕获pyodbc的ProgrammingError特定异常?

如何捕获pandas to_sql()抛出的pyodbc ProgrammingError

问题核心

你遇到的问题根源是:pandas的to_sql()方法会将底层pyodbc抛出的ProgrammingError封装成自身的DatabaseError,直接捕获pyodbc.ProgrammingError无法命中目标异常,因为抛出的顶层异常是pandas封装后的实例。

可行的解决方法

方法1:捕获pandas数据库异常并检查原始异常

from pandas.io.sql import DatabaseError
from pyodbc import ProgrammingError

try:
    # 你的to_sql执行代码
    df.to_sql(name="your_table", con=your_connection, ...)
except DatabaseError as db_err:
    # 穿透异常链,检查是否由pyodbc.ProgrammingError引发
    if isinstance(db_err.__cause__, ProgrammingError):
        # 编写你针对该异常的处理逻辑
        print("捕获到目标SQL语法错误异常")
    else:
        # 非目标异常,重新抛出
        raise

方法2:遍历异常链匹配目标类型

如果不想引入pandas的异常类,可通过遍历异常的__cause__属性定位原始异常:

from pyodbc import ProgrammingError

try:
    df.to_sql(...)
except Exception as e:
    current_exc = e
    target_exc = None
    # 遍历异常链查找目标类型
    while current_exc:
        if isinstance(current_exc, ProgrammingError):
            target_exc = current_exc
            break
        current_exc = current_exc.__cause__
    
    if target_exc:
        # 处理目标异常
        print(f"捕获到ProgrammingError: {target_exc}")
    else:
        raise

方法3:精准匹配错误信息

针对你遇到的特定错误(错误码102、逗号附近语法错误),可直接通过错误字符串匹配:

try:
    df.to_sql(...)
except Exception as e:
    err_str = str(e)
    if "Incorrect syntax near ','" in err_str and "(102)" in err_str:
        # 处理该特定语法错误
        print("捕获到逗号附近的SQL语法错误")
    else:
        raise

关键说明

pandas在数据库操作模块中会统一封装驱动层的异常,因此顶层抛出的不是pyodbc原生异常,必须通过异常链(__cause__属性)找到原始异常实例,才能实现精准捕获。

内容的提问来源于stack exchange,提问作者BlakeB9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:51:28