【问题标题】:Why is a `return` statement inside of except block silently not executed if finally block contains a return statement?如果 finally 块包含 return 语句,为什么除了块内的“return”语句不会静默执行?
【发布时间】:2020-02-22 00:37:17
【问题描述】:

以下代码将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

【问题讨论】:

  • 我不遵循你的伪代码。能不能少写点伪代码多写点代码?
  • 嘿牙签海葵,如果您愿意编辑您的问题以澄清伪代码,我很乐意修改我的答案。我想我设法回答了其余的问题。还是我没有?

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


【解决方案1】:

finally 在退出 try 块之前执行。事实上,finally 总是被执行(即使发生错误也允许一些“清理”)。来自Python docs

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

事实上,即使try 块中的return 也不会被执行,试试:

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 语句将在try 中的return 语句之前执行,而不是子句。

(我的重点。)我想except 也是如此。

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多