是否有可能编写一个无限循环,即使在循环体执行之间发生异常时,异常也可以突破?如果是这样,怎么样? (当我思考稳健性时,这些是我想到的那种愚蠢的事情。)
例如,请考虑以下代码:
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
这将使得摆脱循环变得更加困难(必须在正确的时间背靠背地提出两个例外),但我认为它在理论上仍然是可能的。
答案 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)