我在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块?
答案 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