#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)
. Но вы должны использовать это с умом…