捕获不从Exception继承的异常

fyn*_*yrz 5 python exception-handling

我有一个数据库访问模块,我用查询或命令调用.它弄清楚如何处理数据库,并尝试这样做.但是,例如,如果查询或命令字符串是病态的,则对底层PGDB模块的调用可能会引发异常.

PGD​​B(来自PostgreSQL)返回了一些非常有用的信息,特别是调用了查询或命令中发现的错误.PGD​​B各种函数的这种用法检索该信息:

try:
    pgdb.dothing(mod.withx)
except Exception, e:
    mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: '+str(e)
Run Code Online (Sandbox Code Playgroud)

然后当类返回失败时,对象包含.error和viola中的消息,我可以在查询或命令中修复我的愚蠢.

这一切似乎都运行得很好 - (在Python 2.2.2中,有一天可能会变为2.更高......但现在不是 - 而且永远不会变为3.whatever)

但是...我发现混浊的这一位:" 异常不必须继承自Exception因此纯'除了:’.捕获所有异常,不仅系统的字符串例外是没有例外的一个例子继承自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???'
Run Code Online (Sandbox Code Playgroud)

...因为那真的......有点糟透了.

而且,如果是这种情况,是否有其他方法可以捕获所有类型的所有异常并为它们获取错误消息?看起来这将是一个高度,非常可取的东西(而且它似乎也应该解决它,它应该看起来有点像前一个例子,而不是后者.)

请回答:是的,我知道Python 2.2.2已经过时了.不,它不会很快升级.这是一个拥有数百万行代码的生产系统; 它是稳定的,我们希望它保持这种方式,基于"没有破坏,没有修复".

我只需要充分理解这部分异常过程打败了我.所有的解释似乎都在假设我所知道的......乐观.:)

感谢您的任何见解.

Mee*_*tan 3

尝试一下,尽管这是一个不好的做法。覆盖错误时应该尽可能明确。

try:
    ...
except:
    e = sys.exc_info()
    print e
Run Code Online (Sandbox Code Playgroud)

我还建议查看https://wiki.python.org/moin/HandlingExceptions