以下代码将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
答案 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
也是如此。