python try except 0

7

我正在阅读一些以前写的Python代码,发现了这个:

try:
    # do some stuff
except 0:
    # exception handling stuff

我不确定except 0的意思是什么?我猜测它可以捕获什么也没有,即让异常传播或者它可能是某种开关,通过去除0来打开和关闭调试模式,从而捕获所有异常。

有人能提供一些见解吗?谷歌搜索没有得到任何结果...

谢谢!

以下是一些示例代码(按请求提供):

            try:
                if logErrors:
                    dbStuffer.setStatusToError(prop_id, obj)
                    db.commit()
            except 0:
                traceback.print_exc()

2
你确定它不是写成了except:0吗?(请注意冒号的位置) - NPE
NPE我很肯定,我现在正在看diff。但是我认为except:0应该相当于except:pass吧? - mlnyc
运行时有出现任何错误吗? - Joe Frambach
您能展示一些实际的使用例子吗?如果不看他们实际编写的代码,很难猜测写代码的人是怎么想的。 - NPE
2个回答

2
据我所了解,这对于调试非常有用(捕获异常类型)。在您的示例中,0充当占位符以确定异常的类型。
>>> try:
...   x = 5/1 + 4*a/3
... except 0:
...   print 'error'
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: name 'a' is not defined
>>> try:
...   x = 5/0 + 4*a/3
... except 0:
...   print 'error'
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero

第一种情况下,异常是NameError,而在第二种情况下是ZeroDivisionError。 这里的0充当了捕获任何类型异常的占位符。

>>> try:
...   print 'error'
... except:
... 
KeyboardInterrupt
>>> try:
...   x = 5/0 + 4*a/3
... except:
...   print 'error'
... 
error

1
这就好像根本没有使用try-except语句一样。在这里,except 0:实际上并没有起到任何作用。 - omz
在 except 块中使用 raise 来重新抛出异常会做同样的事情,不是吗? - Ahmed Aeon Axan
它可以帮你避免重新格式化(可能很长的)代码块,但是(因此我猜这就是调试参考)。 - FatalError
我猜这是与“raise”做同样事情的另一种方式。 - karthikr
从Python文档中可以看到,except的定义为:("except" [expression [("as" | ",") target]] ":" suite) - 并且0是一个有效的表达式,因此不会失败。但是,有更明确的方法来引发异常。 - karthikr

1

来自Python文档:

"[...] 如果结果对象与异常“兼容”,则[except]子句匹配该异常。如果一个对象是该异常对象的类或基类,或者是一个包含与异常兼容的项目的元组,则该对象与异常兼容。"

实际上,表达式的类型用于确定except子句是否与异常匹配。由于0是整数类型,因此该类型的异常将匹配。

由于整数不能作为异常抛出,这是一个已禁用的except类,不会捕获任何异常。


1
在Python中无法引发整数异常。在2.7.3上会出现TypeError: exceptions must be old-style classes or derived from BaseException, not int的错误。 - Ahmed Aeon Axan
@AhmedAeonAxan 没错。我刚试了一下。答案已经被编辑过了。 - Ber
我认为在过去(遥远的过去)你可能曾经能够使用 raise int, 0,这将会触发 except 子句中的代码。现在该语句在 运行时 引发异常,但不是在 解析时,因此代码可能从未更新过。参考1 参考2 - mgilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接