我正在使用python开发一个程序,并且达到了一个我不知道如何解决的问题。
我的意图是使用with
语句,避免使用try / except。
到目前为止,我的想法是能够使用continue
语句,因为它将在except
中使用。但是,我似乎没有成功。
让我们假设这是我的代码:
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中留下的所有内容,我正试图避免,因为我希望所有内容都被执行,即使引发了异常。
到目前为止,我还没有找到办法做到这一点。任何意见,将不胜感激。 非常感谢你。
答案 0 :(得分:4)
这是不可能的。
只有两个选项是(a)通过返回false-y值来传播异常,或者(b)通过返回True来吞下异常。无法从抛出异常的位置恢复代码块。无论哪种方式,您的with
区块都已结束。
答案 1 :(得分:1)
你做不到。 with
语句的目的是自动处理清理(这就是为什么可以在退出时抑制异常),而不是作为Visual Basic臭名昭着的On Error Resume Next
。
如果要在引发异常后继续执行块,则需要在try/except
语句中包装引发异常的任何内容。
答案 2 :(得分:0)
虽然大多数答案都是正确的,但我担心没有人能解决我的问题(我知道我没有提供完整的代码,对不起)。
我已经用另一种方法解决了这个问题。我希望能够在With中处理NameError(“未声明的变量”)。如果发生这种情况,我会查看我的对象中的该变量,然后继续。
我现在使用globals()来声明变量。这不是最好的,但它实际上是有效的,让我们继续,因为没有异常正在上升。
谢谢大家!