通常,在try块内触发异常后,您永远都无法将执行返回到特定的代码段,因为该异常可能在很深的某个地方发生,并受其他线程的其他副作用影响的许多其他状态.尽管您的程序可能不是这种情况,但是鉴于没有通用的解决方案允许在Python中进行此操作,因此使用异常处理基本上不可能实现您想做的事情.
但是,SIGINT信号的默认处理程序是引发KeyboardInterrupt异常-如果您可以劫持该键盘以执行其他操作,则实际上可以实现此目的.这是一个简单的程序:
import signal
import pdb
def signal_handler(signal, frame):
pdb.set_trace()
signal.signal(signal.SIGINT, signal_handler)
count = 0
while True:
count += 1
SIGINT处理程序现在只是一个在当前帧调用调试器的函数,每按一次Ctrl-C,就会在代码所在帧的确切点触发调试器.当然,您可以简单地检查以下值:
$python /tmp/script.py
^C--Return--
> /tmp/script.py(5)signal_handler()->None
-> pdb.set_trace()
(Pdb) u
> /tmp/script.py(10)()
-> while True:
(Pdb) pp count
13321869
(Pdb) c
^C--Return--
> /tmp/script.py(5)signal_handler()->None
-> pdb.set_trace()
(Pdb) quit
Traceback (most recent call last):
...
if self.quitting: raise BdbQuit
bdb.BdbQuit
因此,在ctrl-c完成后调试器被触发,然后我跳到运行循环的框架(在您的情况下为您的代码),然后继续执行,再次杀死它并触发了错误的退出(通过键入quit)终止程序.如果将其合并,则基本上可以随时中断并在任何地方检查程序的值.