KeyboardInterrupt нельзя поймать в методах родительского класса - PullRequest
0 голосов
/ 08 мая 2020

У меня есть родительский класс, в котором есть предложение try, а дочерний класс переопределяет метод внутри предложения try. Обычные исключения могут быть обнаружены, когда ребенок его поднимает. Однако исключение прерывания клавиатуры не может быть обнаружено. Более того, его можно поймать внутри дочернего метода, но не в родительском методе.

См. Пример кода, подобный следующему, где прерывание не может быть обнаружено в bar1, но может быть обнаружено после bar2 превращает его в ошибку утверждения. Я создал эту проблему в python 3.6 как в Linux, так и в Windows.

import time
class foo:
    def body(self):
        pass
    def run(self):
        try:
            self.body()
        except Exception as ex:
            print("caught exception:", str(ex))

class bar1(foo):
    def body(self):
        while(1):
            print(1)
            time.sleep(0.1)

class bar2(foo):
    def body(self):
        interrupted = False
        while(1):
            assert not interrupted, "assert not interrupted"
            try:
                print(1)
                time.sleep(0.1)
            except KeyboardInterrupt as ex:
                print("received interrupt")
                interrupted = True

Прерывание метода запуска класса bar1 получает

1
....
1
Traceback (most recent call last):
  File "tmp.py", line 34, in <module>
    b.run()
  File "tmp.py", line 7, in run
    self.body()
  File "tmp.py", line 15, in body
    time.sleep(0.1)
KeyboardInterrupt

Однако прерывание bar2 получает

1
...
1
received interrupt
caught exception: assert not interrupted

Я поискал в StackOverflow и обнаружил некоторые проблемы, касающиеся обработки прерывания клавиатуры с помощью потоков и stdIO , но я не нашел некоторых проблемы вроде этой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...