Что это за безликое исключение Python? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть сценарий, содержащий раздел, подобный этому, на Python 2.6:

import sys

list_id='cow'
prev=[0,'cow']

try:
    if list_id==prev[1]:
        print '{0} is the same as {1}'.format(list_id,prev[1])
        sys.exit(0)
except:
    print 'exception occurred, exiting with error'
    sys.exit(1)

Я заметил, что, хотя он печатал строку "is same", он также регистрирует исключение!

Если вы удалите блок проб / исключений, интерпретатор не выдаст ошибку.Если вы уловили конкретную ошибку, такую ​​как ValueError, блок исключений не выполняется.

import sys

list_id='cow'
prev=[0,'cow']

try:
    if list_id==prev[1]:
        print '{0} is the same as {1}'.format(list_id,prev[1])
        sys.exit(0)
except Exception as k:
    print 'exception occurred, exiting with error. Exception is:'
    print k.args
    sys.exit(1)

Блок исключений не выполняется, и процесс завершается с кодом возврата 0. Таким образом, исключение выше Исключения вИерархия?

import sys

list_id='cow'
prev=[0,'cow']

try:
    if list_id==prev[1]:
        print '{0} is the same as {1}'.format(list_id,prev[1])
        sys.exit(0)
except BaseException as k:
    print 'exception occurred, exiting with error. Exception is:'
    print k.args
    sys.exit(1)

производит

корова такая же, как произошла исключительная ситуация коровы, выход с ошибкой.
Исключение: (0,)

И процесс завершается с кодом выхода 1.

Почему этот блок Except выполняется вообще?

Ответы [ 3 ]

6 голосов
/ 20 сентября 2011

sys.exit() поднимает SystemExit, это то, что вы видите.

Почему он не наследуется от Exception:

Исключение наследует от BaseException вместо StandardError или Exception чтобы случайно не перехватить код Exception. Это позволяет исключению правильно распространяться вверх и вызывать выход интерпретатора.

3 голосов
/ 20 сентября 2011

sys.exit() просто повышает SystemExit.Вот так и выходит из программы.Когда вы ловите все исключения, вы также ловите SystemExit.

2 голосов
/ 20 сентября 2011

В дополнение к другим ответам: SystemExit не наследуется от Exception, иерархия исключений python: http://docs.python.org/library/exceptions.html

...