为什么函数返回抑制引发的异常?

LSZ*_*LSZ 3 python exception

检查以下有关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
Run Code Online (Sandbox Code Playgroud)

然后运行myfunc()将输出而不会弹出任何异常

no matter exception occurs or not
Run Code Online (Sandbox Code Playgroud)

但是如果注释中的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
Run Code Online (Sandbox Code Playgroud)

为什么返回代码对捕获异常如此重要?

Kil*_*nDS 5

直接来自python文档:

如果finally存在,则指定'cleanup'处理程序.执行try子句,包括任何except和else子句.如果任何子句中发生异常但未处理,则会临时保存该异常.finally子句被执行.如果存在已保存的异常,则会在finally子句的末尾重新引发异常.如果finally子句引发另一个异常或执行return或break语句,则丢弃保存的异常:

这是有道理的,因为打印此错误发生在finally语句的末尾.您明确地提前退出语句,以便不应执行打印.