PyCharm警告此代码,说最后一次返回无法访问:
def foo():
with open(...):
return 1
return 0
如果open()
失败,我希望第二次返回会执行。谁是对的?
答案 0 :(得分:11)
PyCharm是对的。如果open()
失败,则会引发异常,并且既未达到 return
。
with
不会以某种方式保护您免受生成上下文管理器的表达式中的异常的影响。 with
之后的表达式应该生成一个上下文管理器,此时它的__exit__
方法被存储,并调用它的__enter__
方法。这里唯一的结果是成功生成并输入了上下文管理器,或者引发了异常。在这个阶段,with
不会吞下异常并默默跳过该区块。