如何在同一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
相关产品推荐
相关产品推荐

