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'
答案 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