如果finally块包含一个return语句,为什么在except块内不执行“ return”语句而无提示?

时间:2019-10-25 16:18:13

标签: python python-3.x exception try-catch

以下代码将JUST KIDDING打印到控制台。为什么不打印“ HIGH FIVE ME!”?

def f():
    print("`f` is being called")
    try:
        raise ValueError()
        raise AttributeError()
        raise type("Hell", (Exception,), dict())
    except BaseException as exc:
        print("we are in the except block")
        # WHY IS "HIGH FIVE ME!" NOT RETURNED?
        return "HIGH FIVE ME!"
    finally:
        return "JUST KIDDING"

print(f())

如果这是所需的行为,是否可以实现类似以下伪代码的内容?

If:
    finally clause, `fin` exists
        and:
    there exists except block `exc` in `fin` such that:
        there exists a return statement in `exc`
then:
    raise terrible horrible bad ugly exception

1 个答案:

答案 0 :(得分:1)

在退出finally块之前执行try。实际上,finally始终执行(即使发生错误也可以进行一些“清理”)。来自Python docs

  

如果存在finally子句,则finally子句将作为try语句完成之前的最后一个任务执行。无论try语句是否产生异常,finally子句都会运行。

实际上,即使return块中的try也不会执行,请尝试:

def f():
    print("`f` is being called")
    try:
        return "HIGH FIVE ME!"
    except BaseException as exc:
        pass
    finally:
        return "JUST KIDDING"

第一行引号后仅几行:

  

如果finally子句包含return语句,则finally子句的return语句将在{strong>而不是之前执行{ return子句中的{1}}语句。

(我的重点。)我想可以肯定地说try也是如此。