try:
try:
raise Exception('0')
finally:
print 1/0
except Exception, e:
print e
它只打印出"整数除法或模数为零"。代码运行时的步骤是什么?
答案 0 :(得分:5)
当存在finally
子句时,无论您如何离开正文,即执行异常或return
语句,都会执行代码。
如果在finally
的正文期间出现异常,则此新异常会替换原始异常,这就是为什么您获得的错误大约是1/0而不是原来的错误异常。
您可以阅读有关处理错误和例外的更多信息in the official documentation on "defining clean-up actions"。
答案 1 :(得分:0)
为什么此例外不会打印0?
因为异常来自语句finally
print 1/0
块
finally
子句,无论是否发生了异常。
raise
语句允许程序员强制发生指定的异常。 我在这个例子中添加了print
语句:
代码:
try:
try:
print "befor--raise"
raise Exception('0')
print "after--raise"
finally:
print "in finally"
print 1/0
except Exception, e:
print "In main Exception"
print e
print "---------"
try:
try:
print "befor--raise"
raise Exception('0')
print "after--raise"
finally:
print "in finally"
print 1/1
except Exception, e:
print "In main Exception"
print e
输出:
~$ python test.py
befor--raise
in finally
In main Exception
integer division or modulo by zero
---------
befor--raise
in finally
1
In main Exception
0
答案 2 :(得分:0)
因为您raise Exception('0')
,但没有处理它,当代码转到finally
时,它会引发一个除外except
之外的异常,如果您尝试这种方式会看到0:
try:
try:
raise Exception('0')
except Exception, error:
print error
finally:
print 1/0
except Exception, e:
print e
输出:
0
integer division or modulo by zero