Ошибка прерывания клавиатуры Python 3

Я заметил, что в любой программе Python 3, независимо от того, насколько она проста, если вы нажмете CTRL c, это приведет к сбою программы, например:

test=input("Say hello")
if test=="hello":
    print("Hello!")
else:
    print("I don't know what to reply I am a basic program without meaning :(")

Если вы нажмете CTRL c, будет ошибка KeyboardInterrupt, есть ли способ предотвратить сбой программы?

Причина, по которой я хочу сделать это, заключается в том, что мне нравится делать свои программы защищенными от ошибок, и всякий раз, когда я хочу вставить что-то во входные данные и случайно нажимаю CTRL c, мне приходится снова проходить мою программу. Что просто очень раздражает.


person E_J    schedule 17.06.2016    source источник
comment
В этом весь смысл Ctrl + C. Это горячая клавиша для выхода из любой запущенной программы.   -  person Morgan Thrapp    schedule 17.06.2016
comment
В самом деле? Никогда не знал, что это было в питоне   -  person E_J    schedule 17.06.2016
comment
Не только Python, все, что вы запускаете в командной строке. Так было со времен ранних систем UNIX.   -  person Morgan Thrapp    schedule 17.06.2016
comment
О, я новичок в программировании, мне всего 14, я даже не знаю, что такое системы UNIX, но я думаю, что это имеет смысл.   -  person E_J    schedule 17.06.2016


Ответы (1)


Control-C поднимет KeyboardInterrupt независимо от того, насколько сильно вы этого не хотите. Тем не менее, вы можете довольно легко справиться с ошибкой, например, если вы хотите, чтобы пользователь дважды нажал Ctrl-c, чтобы выйти при получении ввода, вы можете сделать что-то вроде:

def user_input(prompt):
    try:
        return input(prompt)
    except KeyboardInterrupt:
        print("press control-c again to quit")
    return input(prompt) #let it raise if it happens again

Или, чтобы заставить пользователя вводить что-то независимо от того, сколько раз он использует Control-C, вы можете сделать что-то вроде:

def user_input(prompt):
    while True: # broken by return
        try:
            return input(prompt)
        except KeyboardInterrupt:
            print("you are not allowed to quit right now")

Хотя второй я бы не рекомендовал, так как кто-то, кто использует ярлык, быстро разозлится на вашу программу.

person Tadhg McDonald-Jensen    schedule 17.06.2016
comment
Грац до 10к :-) - person Martin Vseticka; 20.06.2017
comment
В качестве примечания: если у вас Mac копия — это command-c, а KeyboardInterupt — это control-c, поэтому я никогда не сталкиваюсь с этой проблемой при копировании материала. ;П - person Tadhg McDonald-Jensen; 06.07.2018