2014-12-03 70 views
5

我有一个数据库访问模块,我用查询或命令调用。它计算出如何处理数据库,并试图做到这一点。但是,例如,如果查询或命令字符串是病态的,对底层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和中提琴的消息,我可以解决我的查询或命令愚蠢。

而这一切似乎只是做工精细 - (在Python 2.2.2,这可能会改变哪天2.更高......但不是现在 - 而且从来不曾对无论发生什么)

但是......我发现这一点不透明:“异常不需要从Exception继承,因此除了''外,'除了'外,还捕获所有的异常,而不仅仅是系统,字符串异常是一个异常的例子, t从异常继承“

所以这里的问题是:为什么我关心?如果抛出异常,我想知道为什么。我不在乎它来自哪里,实际上,我只是想要错误信息,而且我确实不希望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是旧的。不,它不会很快升级。这是一个拥有数百万行代码的生产系统;它是稳定的,我们希望它保持这种状态,基于“没有破裂,没有修复”。

我只需要对这部分异常过程的打击深入了解。所有的解释似乎都在假设我所知道的......乐观。 :)

感谢您的任何见解。

回答

2

试试这个,虽然这是一个不好的做法。重写错误时,您应尽可能明确。

try: 
    ... 
except: 
    e = sys.exc_info() 
    print e 

我也建议在https://wiki.python.org/moin/HandlingExceptions

+0

“我也建议看看......”我做了。从上面的例外看起来像你的答案,在上面,做了我所问的问题,非常感谢你,另外,我不是在重写错误,我试图找出错误是什么,因为我'当这种情况发生的时候,我不会在那里,一般来说,我需要捕获这些信息并将其自己 - 至少以某种形式呈现给用户 - – fyngyrz 2014-12-03 21:43:05

+0

@fyngyrz,不是问题,也没有任何意图,我只是喜欢链接如果我的回答对你有帮助,w呃不考虑打左边的复选标记? :-) – MeetTitan 2014-12-03 21:52:06

1

看看sys.exc_info()以获得您的普通execpt:子句中的例外信息。

+0

考虑看看,谢谢。这是它的一部分,好吧,但sys.exc_info()返回(,,)查询格式错误,而异常,e返回特定的拧紧。所以它都是:除了:例外,e:紧接着除了:以及从sys.exc_info()中捕获 – fyngyrz 2014-12-03 22:12:38

+1

对于比我更好的答案,你肯定是正确的。但是你错了'sys.exc_info()'返回的内容。 Python中不存在像'(,,)'这样的值。它应该是正确值triple(异常类型,异常实例,追溯)。如果你得到'(,,)'的输出,这可能是由于你正在使用一些不寻常的前端。 – Alfe 2014-12-03 22:19:45

+0

有趣。我知道唯一的前端是PGDB。当我赶上异常,电子邮件:我得到预期的价值。当我捕获除了:只有,然后e = sys.exc_info(),我得到的东西打印出来作为“(,,)”它可能是早期的Python或什么的人工制品。我会做一些测试用例,很容易做到。下一个评论很快。 – fyngyrz 2014-12-04 02:36:55

4

哇。这个问题需要一些时间来解开一些错误的假设。

抓住一切并非完全可取。怎么会这样?如果发生异常,那是因为出现了问题。你不可能编写处理每个可能发生的错误的代码,因为没有代码是完美的。所以当发生不可预见的错误时会引发异常,并为您所知的可处理的代码编写处理代码。

但是,这仍然留下你无法处理的事情:你为什么要抓住那些?你会怎么做,抓住他们?没有必要说“我只会登录它们并继续”,因为现在你的系统处于未定义的状态。这部分数据是否存在?不知道。它是否写入数据库?无法分辨。你刚刚损失了数百万美元的收入?搜索我,古芙。

至于Python版本,如果您正在一个不受支持的平台上运行生产系统,而这个平台上不仅发现了大量严重漏洞,而且实际利用该漏洞并不算“破损”,那么我不知道是什么。

+1

捕捉它们的关键在于,上层可以将该错误传递给正在盯着Web浏览器的用户,并且不会受到来自Web浏览器的消息的CGI去消息的启发向北喷射乳头,并通知IT。我至少可以说“数据库操作失败”,因此您的会话已关闭。 IT部门已经得到通知:“你的假设”catch“=”无论如何“都是假的。关于你对漏洞的假设,这些系统不在WAN上。如果你真的回答了这个问题,打电话给snark(MAX) – fyngyrz 2014-12-03 21:36:26

+2

这实际上并没有回答这个问题,这是一个评论,虽然是一个精心设计的问题 – Veedrac 2014-12-04 10:17:40