Подтвердить что ты не робот

Почему, наконец, блок выполняется после вызова sys.exit(0) за исключением блока?

Я новичок в Python. Я просто хочу знать, почему блок finally выполняется после вызова sys.exit(0) в блоке except?

код:

import sys

def sumbyzero():
    try:
        10/0
        print "It will never print"
    except Exception:
        sys.exit(0)
        print "Printing after exit"
    finally:
        print "Finally will always print"

sumbyzero() 

Btw. Я просто пытался сделать то же самое, что и в Java, где блок finally не выполняется, когда System.exit(0) находится в блоке catch.

4b9b3361

Ответ 1

Все sys.exit() действительно вызывает исключение типа SystemExit.

Из документации:

Выход из Python. Это выполняется путем повышения значения SystemExitисключение, поэтому действия очистки, указанные в finally предложениях tryзаявления соблюдены, и можно перехватить выход попытайтесь выйти на внешний уровень.

Если вы запустите следующее, вы увидите сами:

import sys
try:
  sys.exit(0)
except SystemExit as ex:
  print 'caught SystemExit:', ex

В качестве альтернативы os._exit() остановит процесс, минуя большую часть очистки, включая блоки finally и т.д.

Ответ 2

О вашем примере:

Предложение finally всегда выполняется перед тем, как оставить оператор try, возникло ли исключение или нет.

Это из Ошибка и исключения в документах Python. Итак - ваш блок finally всегда будет выполнен в примере, который вы покажете, если не используете os._exit(). Но вы должны использовать его мудро...