检查以下有关python中的异常处理的代码
class myException(Exception):
def __str__(self):
return 'this is my exception'
class myException2(Exception):
def __str__(self):
return 'this is my exception 2'
def myfunc():
try:
raise myException2
print('after exception')
except myException:
a = 'exception occur'
print(a)
else:
a = 'exception doesn\'t occur'
print(a)
finally:
a = 'no matter exception occurs or not'
print(a)
return a
然后运行myfunc()将输出而不会弹出任何异常
no matter exception occurs or not
但是如果注释中的finally子句中的'return a'代码,则输出将捕获未处理的myException2,
no matter exception occurs or not
---------------------------------------------------------------------------
myException2 Traceback (most recent call last)
<ipython-input-140-29dfc9311b33> in <module>()
----> 1 myfunc()
<ipython-input-139-ba35768198b8> in myfunc()
1 def myfunc():
2 try:
----> 3 raise myException2
4 print('after exception')
5 except myException:
myException2: this is my exception 2
为什么返回代码对捕获异常如此重要?
答案 0 :(得分:5)
直接来自python docs:
如果finally存在,则指定'cleanup'处理程序。试试 执行子句,包括任何except和else子句。如果 异常发生在任何条款中,并且不处理, 异常暂时保存。 finally子句被执行。如果 有一个保存的异常,它在finally的最后重新引发 条款。 如果finally子句引发另一个异常或执行一个 return或break语句,丢弃保存的异常:
这是有道理的,因为打印此错误发生在finally语句的末尾。您提前明确退出语句,因此不应执行打印。