Python with语句,continue

3
我正在使用 Python 开发一个程序,目前遇到了一个不知如何解决的问题。我的意图是使用 with 语句来避免使用 try/except,但是目前的想法是在 except 中使用 continue 语句。然而,我似乎并没有成功。
假设这是我的代码:
def A(object):
    def __enter__:
        return self

    def __exit__:
        return True

with A():
    print "Ok"
    raise Exception("Excp")
    print "I want to get here"

print "Outside"

阅读文档后,我发现通过在 __exit__ 方法中返回 True,就可以阻止异常继续传递,就像使用 pass 语句一样。但是,这将立即跳过 with 剩余的所有内容,而我想避免这种情况,因为我希望执行所有代码块,即使发生异常。
到目前为止,我还没有找到解决方法。如果有建议,请不吝赐教。 非常感谢。

你可以使用警告,但是恐怕在异常处理方面这是不可能的。 - User
1
我可能会后悔问这个问题,但是你为什么要避免使用try/except呢?你似乎想重新实现try/except中的finally子句,这让我想知道为什么你不直接将你的with子句实现为一个try/except语句。 - Tim Pierce
1
当调用__exit__时,就是这样了。你已经退出了上下文。你不能再回去了。 - Martijn Pieters
3个回答

3

这是不可能的。

唯一的两个选择是(a)通过返回一个假值让异常传播或者(b)通过返回True来吞下异常。没有办法从抛出异常的地方恢复代码块执行。无论哪种方式,你的 with 代码块都已经结束了。


1
你做不到。 with 语句的目的是自动处理清理(这就是为什么退出时异常可以被抑制),而不是像Visual Basic的臭名昭著的 On Error Resume Next 那样运行。如果您想在引发异常后继续执行块,则需要将引发异常的任何内容包装在 try / except 语句中。

0

虽然大部分答案都是正确的,但恐怕没有一个适合我的问题(我知道我没有提供我的整个代码,对此感到抱歉)。

我采用了另一种方法来解决这个问题。我想能够在With语句中处理NameError(“变量未声明”)。如果发生这种情况,我会在我的对象中查找该变量并继续执行。

现在我正在使用globals()来声明变量。这不是最好的方法,但它确实有效,并且让with语句继续执行而不会引发任何异常。

谢谢大家!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接