Существует здравый смысл, что каждое исключение происходит от класса Exception. Когда вы пишете:
try:
dwarfs_stupid_trick()
except Exception as e:
Amok_happy()
это то же самое, что
try:
dwarfs_stupid_trick()
except:
Amok_happy()
Но это не так.
Сегодня я узнал, что есть несколько стандартных исключений, которые не являются производными от класса Exception. Это:
>>> issubclass(KeyboardInterrupt, Exception) False >>> issubclass(SystemExit, Exception) False
Они являются производными от класса BaseException, который, в свою очередь, является родительским для класса Exception.
Я нашел это как ошибку в моем очень умном менеджере контекста, который предоставляет услугу «очистки», когда код внутри контекста прерывается исключением. Все работало нормально, кроме KeyboardInterrupt. Я использовал except Exception as e, и это было ошибкой, правильно было использовать except BaseException as e.