为什么除了对象捕获Python中的所有内容之外没有?

时间:2016-08-03 18:52:50

标签: python exception python-2.x python-internals

section 7.4中的python语言参考:

  

对于带有表达式的except子句,将计算该表达式,如果结果对象与异常“兼容”,则子句匹配异常。如果对象是异常对象的类或基类,或者包含与异常兼容的项的元组,则该对象与异常兼容。

那么,为什么没有except object:抓住一切? object是所有异常类的基类,因此except object:应该能够捕获每个异常。

例如,这应该抓住AssertionError

print isinstance(AssertionError(), object) # prints True
try:
    raise AssertionError()
except object:
    # This block should execute but it never does.
    print 'Caught exception'

1 个答案:

答案 0 :(得分:3)

我相信答案可以在source code for python 2.7

中找到
        else if (Py_Py3kWarningFlag  &&
                 !PyTuple_Check(w) &&
                 !Py3kExceptionClass_Check(w))
        {
            int ret_val;
            ret_val = PyErr_WarnEx(
                PyExc_DeprecationWarning,
                CANNOT_CATCH_MSG, 1);
            if (ret_val < 0)
                return NULL;
        }

所以,如果w(我假设except语句中的表达式)不是元组或异常类Py_Py3kWarningFlag已设置则尝试在except块中使用无效的异常类型将显示警告。

通过在执行文件时添加-3标志来设置该标志:

Tadhgs-MacBook-Pro:~ Tadhg$ python2 -3 /Users/Tadhg/Documents/codes/test.py
True
/Users/Tadhg/Documents/codes/test.py:5: DeprecationWarning: catching classes that don't inherit from BaseException is not allowed in 3.x
  except object:
Traceback (most recent call last):
  File "/Users/Tadhg/Documents/codes/test.py", line 4, in <module>
    raise AssertionError()
AssertionError