isinstance(SystemExit(1), Exception)
evals为True,但此代码段会打印"caught by bare except SystemExit(1,)"
。
try:
sys.exit(0)
except Exception, e:
print 'caught by except Exception', str(e)
except:
print 'caught by bare except', repr(sys.exc_info()[1])
我的测试环境是Python 2.6。
答案 0 :(得分:13)
isinstance(SystemExit(1), Exception)
在Python 2.6上是假的。自Python 2.4以来,此版本的Python中的异常层次结构已更改。
E.g。 KeyboardInterrupt
不再是Exception
的子类。
查看更多信息http://docs.python.org/release/2.6.6/library/exceptions.html#exception-hierarchy
答案 1 :(得分:11)
SystemExit
来自BaseException directly rather than from Exception。
Exception
是父"All built-in, non-system-exiting exceptions"
SystemExit是“系统退出异常”(根据定义),因此不是从Exception
派生的。在您的示例中,如果您使用BaseException
,它将按照您原来的假设运行。
答案 2 :(得分:8)
您的错误出现在您问题的第一句话中:
>>> isinstance(SystemExit(1), Exception)
False
SystemExit
不是Exception
的子类。