当我运行此代码时:
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
希望这能澄清混乱。