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

如何在同一ProgrammingError异常类下区分处理不同错误?

区分处理pyodbc同一ProgrammingError下的不同错误

pyodbc的ProgrammingError异常会携带具体的错误状态码和详细信息,你可以通过这些内容区分不同错误类型,实现差异化处理。

核心判断依据

两种错误的关键区分点:

  • 列名无效错误:SQL状态码为42S22,错误消息中包含错误编号(207)
  • 语法错误:SQL状态码为42000,错误消息中包含错误编号(102)

你可以在except块中捕获异常实例,提取这些信息来分支处理:

from pyodbc import ProgrammingError

try:
    # 替换成你的实际执行代码,比如执行SQL语句
    cursor.execute(your_sql_query)
except ProgrammingError as e:
    # 从异常args中提取状态码和错误详情
    error_info = e.args[0]
    error_state = error_info[0]
    error_msg = error_info[1]

    # 处理列名无效的情况
    if error_state == '42S22' or '(207)' in error_msg:
        print("列名不存在,请检查SQL中的列名拼写是否正确")
        # 这里写你的具体处理逻辑:比如记录日志、返回友好提示等
    # 处理语法错误的情况
    elif error_state == '42000' or '(102)' in error_msg:
        print("SQL语法错误,请检查语句中的符号(比如逗号)是否正确")
        # 这里写你的具体处理逻辑:比如验证SQL格式、排查语法问题等
    # 兜底处理其他未匹配的ProgrammingError
    else:
        print("遇到未预期的数据库编程错误")
        # 可选:重新抛出异常,交给上层逻辑处理
        raise

补充说明

  • 优先用SQL状态码判断,它是标准标识,比错误消息的文字更可靠(避免语言本地化影响)
  • 结合错误编号做双重验证,能提升判断的准确性
  • 保留兜底分支,避免遗漏其他类型的ProgrammingError

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:05:25