什么是这个无特色的Python异常?

时间:2011-09-19 21:29:36

标签: python exception python-2.6

我在Python 2.6上有一个包含与此类似的部分的脚本:

import sys

list_id='cow'
prev=[0,'cow']

try:
    if list_id==prev[1]:
        print '{0} is the same as {1}'.format(list_id,prev[1])
        sys.exit(0)
except:
    print 'exception occurred, exiting with error'
    sys.exit(1)

我注意到虽然它打印了“是相同的”行,但它也会记录异常!

如果删除try / except块,则解释器不会显示错误。如果捕获到ValueError之类的特定错误,则不执行except块。

import sys

list_id='cow'
prev=[0,'cow']

try:
    if list_id==prev[1]:
        print '{0} is the same as {1}'.format(list_id,prev[1])
        sys.exit(0)
except Exception as k:
    print 'exception occurred, exiting with error. Exception is:'
    print k.args
    sys.exit(1)

不执行except块,并且该过程以返回码0结束。因此,异常高于层次结构中的异常?

import sys

list_id='cow'
prev=[0,'cow']

try:
    if list_id==prev[1]:
        print '{0} is the same as {1}'.format(list_id,prev[1])
        sys.exit(0)
except BaseException as k:
    print 'exception occurred, exiting with error. Exception is:'
    print k.args
    sys.exit(1)

产生

  

牛与发生牛异常相同,退出时出错   例外是:(0,)

该过程以退出代码1结束。

为什么要执行此Except块?

3 个答案:

答案 0 :(得分:6)

sys.exit()提出了SystemExit,这就是你所看到的。

至于为什么它不从Exception继承:

  

该异常继承自BaseException而非StandardError或   Exception以便它不会被捕获的代码意外捕获   Exception。这允许异常正确传播并导致解释器退出。

答案 1 :(得分:3)

sys.exit()只会引发SystemExit。这就是它退出程序的方式。当您捕获所有异常时,您还会捕获SystemExit

答案 2 :(得分:2)

除了其他答案:SystemExit不继承Exception,python异常层次结构:http://docs.python.org/library/exceptions.html