Почему, наконец, блок выполняется после вызова 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
.
Ответы
Ответ 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()
. Но вы должны использовать его мудро...