首页 > 解决方案 > 如何处理 *any* pyodbc 异常 args 编码

问题描述

我正在与无法像这样记录的异常作斗争。

这种带有显式编码的方法有效

try:
    res = cur.execute(qry)
except pyodbc.Error as e:
    app.logger.error('database error! %s' % type(e))
    app.logger.error(str(e).encode(encoding='charmap', errors='replace'))

但结果可能相当难看。
这是试图在数字列中搜索“-”。

核心错误:db_execute 数据库错误!<class 'pyodbc.DataError'>
核心错误:b"('22018', '[22018] [Oracle][ODBC][Ora]ORA-01722: 无效编号\n\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00??\xee\x00\ue961??\x00??\xee\x00\x03\x00\x00\x00?\x00\x00\x00???\x00 \x00\x00\x00\x00\x00\x00\x00\x00?? (1722) (SQLExecDirectW)')"

我无法确定这到底是什么字符集。
我可以通过拆开来稍微整理一下e.args,但我无法验证 args[0] 和 args[1] 是否会一直存在。

但最大的问题是我怀疑 args[1] 可以包含来自数据库或驱动程序的完全任意字符串。

对于如何将这些异常转换为人类可读和可记录的字符串的任何澄清或提示,我将不胜感激,最好独立于我们使用的数据库。

标签: pythonoraclepyodbc

解决方案


推荐阅读