我有一个数据库访问模块,我用查询或命令调用。它弄清楚如何处理数据库,并尝试这样做。但是,例如,如果查询或命令字符串是病态的,则对底层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.更高......但现在不会 - 而且永远不会变为3.whatever)
但是...我发现了这一点不透明:“异常不必从Exception继承。因此普通的'except:'捕获所有异常,而不仅仅是系统。字符串异常是一个例子不从Exception继承的异常“
所以这就是问题:我为什么关心?如果抛出异常,我想知道原因。我不在乎它来自哪里,真的,我只是想要错误消息,我确定不希望Python崩溃。这将包括如果错误来自字符串的东西或其他什么。所以除了捕捉一切都很好。或者它应该是。
是否Exception的参数意味着,如果它来自例如String内部,我将不会捕获错误?那么,代码会因未捕获的异常而停止吗?然后我需要针对“不从异常继承”的每种类型获取一系列捕获以获得我想要的行为?像这样:
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已经过时了。不,它不会很快升级。这是一个拥有数百万行代码的生产系统;它是稳定的,我们希望它保持这种方式,基于“没有破坏,没有修复。”
我只需要充分理解这部分异常过程打败了我。所有的解释似乎都在假设我所知道的......乐观。 :)
感谢您的任何见解。
答案 0 :(得分:4)
哇。在这个问题中,它需要花一些时间来解开一些错误的假设。
抓住所有东西根本不可取。怎么会这样?如果引发异常,那是因为出了问题。您无法编写处理可能发生的每个错误的代码,因为没有代码是完美的。因此,当发生无法预料的错误时会引发异常,并为您知道可以处理的错误编写处理代码。
但这仍然留下你无法处理的事情:你为什么要抓住那些?抓住他们后会做什么?没有必要说"我只是记录它们,继续",因为现在你的系统处于未定义的状态。这段数据是否存在?不知道。是否已写入数据库?不能告诉你。你刚刚损失了数百万美元的收入吗?搜索我,guv。
关于Python版本,如果您在不受支持的平台上运行生产系统这一事实,其中不仅发现了大量严重漏洞,而且实际利用了这些漏洞,那么这些漏洞就不会被视为"已损坏&#34 ;,然后我不知道是什么。
答案 1 :(得分:2)
试试这个,虽然这是一个不好的做法。在覆盖错误时,您应该尽可能明确。
try:
...
except:
e = sys.exc_info()
print e
答案 2 :(得分:1)
查看sys.exc_info()
以获取普通execpt:
子句中的异常信息。