2012-03-13 55 views
12

例如,考虑的情况:为什么python异常通常不打印违规值?

>>> a = [] 
>>> a[12] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list index out of range 

异常时,不打印超出范围的值。

我的猜测是,我们不知道__str__函数是否传入会引发异常,所以我们不会触及它?

+0

[这里](http://hg.python.org/cpython/file/2145593d108d/Objects/listobject.c#l185)是有问题的源代码。正如你所看到的,似乎没有理由不在异常消息中包含“i”和“Py_SIZE(op)”。 – 2012-03-13 19:30:27

+0

+1,因为这在大多数编程语言中是一个非常普遍的问题。例如Java和C#都有同样的问题。甚至很多数据库。尝试在Oracle或IBM DB2中为某列插入一个太大的值,这两个值都只会返回一个错误,指出“对于列来说值太大”,但不会说什么列或值是什么。 – CodingWithSpike 2012-03-13 19:54:07

回答

3

该值可以打印,但它不是。

但是,PyPI上有一个tb module实际上会打印堆栈跟踪中变量的值。

+1

为什么在'cgitb'模块已经这样做并且已经包含它的时候使用它。使用'cgitb.enable(format ='text')'控制台使用。 – 2012-03-13 19:46:15

2

了解__str__方法不是问题 - 如果它没有提供给对象,则使用__repr__代替,并且任何情况__repr__在异常消息中通常会更有意义。至于原因,我不认为有一个具体原因。如果你建议改变并提交一个补丁,那么我们就不会拒绝为什么它会被拒绝。但是,实际做出这种改变可能会是一笔相当大的工作,因为无论发生什么情况,这都意味着改变。这实际上可能是它没有完成的主要原因。如果周围有一个python开发人员,他们可能会给出更好的答案...

编辑:它的值得指出的是,并非所有例外情况都是如此。例如,AttributeError会报告违规值。