Почему "кроме исключения" не улавливает 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
.