У меня есть родительский класс, в котором есть предложение 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 , но я не нашел некоторых проблемы вроде этой.