python如何在无限循环期间处理KeyboardInterrupt



当我运行此代码时:

while 1:
try:
pass
except KeyboardInterrupt:
pass

并且我按下ctrl+c试图通过KeyboardInterrupt终止程序,我通常是,但并不总是成功的。大多数时候,我第一次尝试ctrl+c会终止程序,但有时,我需要按两次ctrl+c

将其与此代码进行比较:

from time import sleep
while 1:
try:
sleep(0.000000000000000000000000000000000000000000000000000000000000000000001)
except KeyboardInterrupt:
pass

有了这段代码,无论我按ctrl+c多少次,程序都不会终止。

我的假设是,在第一种情况下,我的KeyboardInterrupt通常有效,因为pass语句执行得太快,所以我更有可能在while循环条件检查期间(不在try块中(按下ctrl+c,而不是在pass语句执行期间(在try框中(按下。

而且,在第二个例子中,我假设睡眠函数的执行时间必须比while循环条件检查长得多,这样我几乎可以保证在执行过程中按下ctrl+c(从而在try块中捕获KeyboardInterrupt并继续循环(。

有人能证实我的假设或给出另一种推理吗?

由于在这两种情况下都是pass处理键盘中断,因此程序只继续while循环。

对于第二种情况,由于try块体中的sleep,在sleep期间,您的KeyboardInterrupt命中进程的几率要高出mu8ch,这意味着您的except块几乎可以保证执行。这意味着你的程序只是继续。你可以通过在except块中添加一个打印来测试这一点。

from time import sleep
while 1:
try:
sleep(0.000000000000000000000000000000000000000000000000000000000000000000001)
except KeyboardInterrupt:
print('exc')
pass

如果我运行这个并按Ctrl+C,我得到:

>python so_test.py
exc
exc
exc
exc
exc
exc
exc
exc

对于每个Ctrl+C,都会执行except块,但您的程序会继续。

然而,在第一种情况下,由于try块中没有任何延迟(即sleep(,当KeyboardInterrupt进入您的进程时,程序很可能在try块之外执行(在进入之前或之后(。这意味着你的异常没有得到处理,这就结束了程序。但是,如果中断击中了try-块内的进程,程序将继续。检查此项:

while 1:
try:
pass
except KeyboardInterrupt:
print('exc')
pass

你可以得到这个:

>python so_test.py
exc
exc
exc
exc
Traceback (most recent call last):
File "so_test.py", line 5, in <module>
pass
KeyboardInterrupt

希望这能澄清混乱。

相关内容

  • 没有找到相关文章

最新更新