Почему "кроме исключения" не улавливает SystemExit?

isinstance(SystemExit(1), Exception) evals для True, но этот фрагмент печатает "caught by bare except SystemExit(1,)".

try:
    sys.exit(0)
except Exception, e:
    print 'caught by except Exception', str(e)
except:
    print 'caught by bare except', repr(sys.exc_info()[1])

Моя тестовая среда - это Python 2.6.

Ответ 1

isinstance(SystemExit(1), Exception) False на Python 2.6. Иерархия исключений в этой версии Python была изменена с Python 2.4.

например. KeyboardInterrupt уже не является подклассом Exception.

Дополнительная информация http://docs.python.org/release/2.6.6/library/exceptions.html#exception-hierarchy

Ответ 2

SystemExit происходит от BaseException напрямую, а не от Exception.

Exception является родительским "Все встроенные исключения, не зависящие от системы"

SystemExit - это "исключение из системы" (по определению) и, следовательно, не получается из Exception. В вашем примере, если вы использовали BaseException, он работал бы в соответствии с вашими исходными предположениями.

Ответ 3

Ваша ошибка в самом первом предложении вашего вопроса:

>>> isinstance(SystemExit(1), Exception)
False

SystemExit не является подклассом Exception.