Почему «кроме исключения» не ловит SystemExit? - PullRequest
11 голосов
/ 19 апреля 2011

isinstance(SystemExit(1), Exception) превращается в 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.

Ответы [ 3 ]

13 голосов
/ 19 апреля 2011

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

например. KeyboardInterrupt больше не является подклассом Exception.

Подробнее http://docs.python.org/release/2.6.6/library/exceptions.html#exception-hierarchy

11 голосов
/ 19 апреля 2011

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

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

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

8 голосов
/ 19 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...