【发布时间】:2015-02-01 14:20:15
【问题描述】:
我有一个使用查询或命令调用的数据库访问模块。它弄清楚如何处理数据库,并尝试这样做。但是,例如,如果查询或命令字符串是病态的,则对底层 PGDB 模块的调用可能会引发异常。
PGDB(来自 PostgreSQL 下)返回了一些非常有用的信息,特别指出在查询或命令中发现了哪些错误。 PGDB 的各种函数的这种用法检索该信息:
try:
pgdb.dothing(mod.withx)
except Exception, e:
mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: '+str(e)
然后当类返回失败时,对象包含 .error 和 viola 中的消息,我可以在查询或命令中修复我的愚蠢。
这一切似乎都运行良好——(在 Python 2.2.2 中,有朝一日可能会更改为 2.higher ......但现在不会——永远不会,永远不会更改为 3.whatever)
但是...我发现了一点不透明性:“异常不必从异常继承。因此简单的'except:'捕获所有异常,不仅是系统异常。字符串异常是一个例子不继承自 Exception 的异常"
所以问题来了:我为什么要关心?如果抛出异常,我想知道为什么。我不在乎它来自哪里,真的,我只想要错误消息,而且我当然不希望 Python 崩溃。这将包括错误是否来自字符串事物或其他。所以除了抓住一切都很好。或者应该是。
是不是异常的参数意味着,如果它来自例如字符串内部,我不会捕获错误?然后,代码将因未捕获的异常而停止?然后我需要为每种“不从异常继承”的类型进行一系列捕获,以获得我想要的行为?像这样的:
try:
pgdb.dothing(mod.withx)
except Exception, e:
mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: '+str(e)
except:
mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: WTF???'
...因为那真的...有点烂。
如果是这样的话,有没有其他方法可以捕获所有类型的所有异常并为它们获取错误消息?看起来这将是非常非常理想的事情(而且似乎单线应该解决它,它应该看起来有点像前一个例子,而不是后者。)
请在回答之前:是的,我知道 Python 2.2.2 已经过时了。不,它不会很快升级。这是一个拥有数百万行代码的生产系统;它是稳定的,我们希望它保持这种状态,基于“不损坏,不修复”。
我只需要对我遇到的异常过程的这一部分有充分的了解。所有的解释似乎都是对我所知道的……乐观的假设。 :)
感谢您的任何见解。
【问题讨论】: