通过跳过当前循环迭代来处理IOError

时间:2017-03-20 23:16:15

标签: python

我的代码结构如下(简化):

while self.flag == True:
    function1()
    function2()
    function3()
    function4()
    self.emit(...)

有时候由于硬件问题,我碰巧得到了IOErrors - 并不是什么大不了的事,我所要做的就是手动重启这个循环但是我希望程序在发生错误时继续使用该程序。

我知道

try:
    <something>
except IOError:
    <something>

在这种情况下

try:
    <my loop>
except IOerror:
    pass

可行。但是我对这个实现不太确定,因为如果在function2中间有错误说。我不想让function3()或function4()运行。我希望程序跳回到function1()并忽略循环的其余部分。

据我所知,传递什么都不做,并允许程序继续。由于我的应用程序,如果存在IOError,我肯定知道我的函数的输出会被破坏所以我只需要它完全跳过当前的循环迭代。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

如果您只是想跳过当前的迭代并重试,请不要将整个loop放在try内,将try放在loop中:

while self.flag == True:
    try:
        function1()
        function2()
        function3()
        function4()
        self.emit(...)
    except IOError as e:
        // handle your error here
        pass

答案 1 :(得分:0)

try: except:放入循环中,例如:

while self.flag:
    try:
        function1()
        function2()
        function3()
        function4()
        self.emit(...)
    except IOError:
        continue

答案 2 :(得分:0)

如果这变得很普遍,我会把它包装到上下文管理器中:

from contextlib import contextmanager

@contextmanager
def ignoring(exception):
    try:
        yield
    except exception:
        pass

然后,您可以在任何想要忽略异常的地方使用它:

while self.flag:
    with ignoring(IOError):
        function1()
        function2()
        function3()
        function4()
        self.emit(...)

我还会将这些函数收集到一个函数中:

def process(self):
    function1()
    function2()
    function3()
    function4()
    self.emit(...)

然后你就离开了:

while self.flag:
    with ignoring(IOError):
        self.process()

我觉得很可读。