如何捕获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
相关产品推荐
相关产品推荐

