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

#python

#python

Вопрос:

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

Код:

 import sys

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

divide_by_zero() 
  

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

Комментарии:

1. «Мягкий выход» на самом деле очень удобное поведение. Вы можете сделать sys.exit(1) это при обработке исключения и при этом сможете выполнить некоторую важную окончательную очистку, такую как закрытие соединений, файлов и т. Д.

Ответ №1:

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

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

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

Если вы выполните следующее, вы сами убедитесь:

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

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

Ответ №2:

Вы должны использовать os._exit(0) .

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

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

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