为什么“除了异常”没有捕获SystemExit?

时间:2011-04-19 09:49:56

标签: python exception-handling

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。

3 个答案:

答案 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的子类。