Поскольку вы pass
используете прерывание клавиатуры в обоих случаях, программа просто продолжает выполнение с while
l oop.
Во втором случае, из-за sleep
в теле блока try
, существует более высокий шанс того, что вы KeyboardInterrupt
попадете в процесс во время этого sleep
- что означает, что вы Блок 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
выполнен, но ваша программа продолжается.
В первом первом случае, однако, из-за отсутствия какой-либо задержки (т.е. sleep
) в блоке try
программы с такой же вероятностью будут выполняться вне блока try
(до введите его или после), когда KeyboardInterrupt
попадет в ваш процесс. Это означает, что ваше исключение не обрабатывается, и это завершает программу. Однако, если прерывание попадает в процесс внутри 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
Надежда, которая прояснит путаницу.