Существует здравый смысл, что каждое исключение происходит от класса 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
.