如何编写一个异常无法解决的无限循环?

时间:2015-01-18 22:39:28

标签: python python-2.7 loops exception-handling infinite-loop

是否有可能编写一个无限循环,即使在循环体执行之间发生异常时,异常也可以突破?如果是这样,怎么样? (当我思考稳健性时,这些是我想到的那种愚蠢的事情。)

例如,请考虑以下代码:

import time

def slow_true():
    print 'waiting to return True...'
    time.sleep(1.0)
    return True

while slow_true():
    try:
        print 'in loop body'
        raise RuntimeError('testing')
    except:
        print 'caught exception, continuing...'
        continue

当Python正在执行slow_true()时,我可以使用Ctrl-C轻松摆脱循环。即使我将while slow_true():替换为while True:,理论上也会有一个小的时间窗口(在正文的执行之间),SIGINT会导致脚本退出。

我意识到我可以实现一个SIGINT处理程序来有效地禁用Ctrl-C,但这不是这个问题的重点。

我可以用另一个无限循环包裹循环,并将try / except移出一个这样的级别:

import time

def slow_true():
    print 'waiting to return True...'
    time.sleep(1.0)
    return True

while True:
    try:
        while slow_true():
            print 'in loop body'
            raise RuntimeError('testing')
    except:
        print 'caught exception, restarting...'
        continue
    break

这将使得摆脱循环变得更加困难(必须在正确的时间背靠背地提出两个例外),但我认为它在理论上仍然是可能的。

1 个答案:

答案 0 :(得分:4)

绝对不推荐的选项是覆盖excepthook方法。

import sys

def exception_hook(exception_type, value, traceback):
    your_loop_function()

sys.excepthook = exception_hook

使用信号的替代解决方案(不太糟糕):

import signal

def interrupt(signal, frame):
    your_loop_function()

signal.signal(signal.SIGINT, interrupt)