Я не знаю , почему мы должны finally
в try...except...finally
отчетности. На мой взгляд, этот блок кода
try:
run_code1()
except TypeError:
run_code2()
other_code()
то же самое с этим, используя finally
:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
Я что-то упускаю?
Вы можете использовать,
finally
чтобы убедиться, что файлы или ресурсы закрыты или освобождены независимо от того, произошло ли исключение, даже если вы не перехватили исключение. (Или, если вы не поймаете это конкретное исключение.)В этом примере лучше использовать
with
оператор, но такую структуру можно использовать для других видов ресурсов.Через несколько лет я написал пост в блоге о злоупотреблении,
finally
которое читатели могут найти забавным.источник
Они не эквивалентны. Наконец, код выполняется независимо от того, что еще происходит. Это полезно для очистки кода, который должен быть запущен.
источник
Finally code is run no matter what else happens
... если нет бесконечного цикла. Или powercut. Илиos._exit()
. Или ...os._exit
.Чтобы добавить к другим ответам выше,
finally
предложение выполняется независимо от того, что, тогда какelse
предложение выполняется, только если исключение не было вызвано.Например, запись в файл без исключений выдаст следующее:
ВЫВОД:
Если есть исключение, код выведет следующее (обратите внимание, что преднамеренная ошибка вызвана сохранением файла только для чтения.
ВЫВОД:
Мы видим, что
finally
предложение выполняется независимо от исключения. Надеюсь это поможет.источник
else
была вещь. Полезно знать.Блоки кода не эквивалентны.
finally
также будет выполнено, еслиrun_code1()
выбрасывает исключение, отличное отTypeError
, или еслиrun_code2()
выбрасывает исключение, тогда какother_code()
в первой версии в этих случаях не будет выполняться.источник
В вашем первом примере, что произойдет, если возникнет
run_code1()
исключение, которого нетTypeError
? ...other_code()
не будет казнен.Сравните это с
finally:
версией:other_code()
гарантированно будет выполнено независимо от того, какое исключение возникло.источник
Как объясняется в документации ,
finally
пункт предназначен для определения действий по очистке, которые должны выполняться при любых обстоятельствах .Пример:
Как видите,
finally
предложение выполняется в любом случае.TypeError
Поднят путем деления две строки не обрабатываетсяexcept
пунктом и , следовательно , повторно поднят после того , какfinally
пункт был выполнен.В реальных приложениях предложение finally полезно для освобождения внешних ресурсов (таких как файлы или сетевые подключения), независимо от того, было ли использование ресурса успешным.
источник
Прекрасный пример как ниже:
источник
finally
для определения "действий по очистке" .finally
Предложение выполняется в любом случае , прежде чем покинутьtry
оператора, независимо от того, произошло ли исключение (даже если вы его не обрабатываете) или нет.Я второй пример @ Байерса.
источник
Наконец, может также использоваться, когда вы хотите запустить «необязательный» код перед запуском кода для вашей основной работы, и этот необязательный код может не работать по разным причинам.
В следующем примере мы точно не знаем, какие исключения
store_some_debug_info
могут выдавать.Мы могли бы запустить:
Но большинство линтеров будут жаловаться на слишком расплывчатое исключение. Кроме того, так как мы выбираем только
pass
для ошибок,except
блок не добавляет ценности.Приведенный выше код имеет тот же эффект, что и 1-й блок кода, но является более кратким.
источник
Профессиональное использование delphi в течение нескольких лет научило меня защищать мои процедуры очистки, используя, наконец. Delphi в значительной степени принудительно использует использование finally для очистки любых ресурсов, созданных перед блоком try, чтобы не вызвать утечку памяти. Так же работает Java, Python и Ruby.
и ресурс будет очищен независимо от того, что вы делаете между попыткой и наконец. Кроме того, он не будет очищен, если выполнение никогда не достигнет
try
блока. (т.е.create_resource
сам вызывает исключение). Это делает ваш код безопасным для исключений.Относительно того, почему вам действительно нужен блок finally, не для всех языков. В C ++, где вы автоматически вызываете деструкторы, которые обеспечивают очистку, когда исключение разворачивает стек. Я думаю, что это шаг вперед в направлении более чистого кода по сравнению с попытками ... наконец-то языков.
источник
Блок try имеет только одно обязательное условие: оператор try. Предложения exc, else и finally не являются обязательными и основаны на предпочтениях пользователя.
finally: Прежде чем Python покинет оператор try, он выполнит код в блоке finally при любых условиях, даже если завершает программу. Например, если Python столкнулся с ошибкой во время выполнения кода в блоке "else" или "else", блок finally будет по-прежнему выполняться перед остановкой программы.
источник
Запустите эти коды Python3, чтобы увидеть необходимость наконец:
СЛУЧАЙ 1:
Вариант 2:
Попробуйте каждый раз вводить следующие данные:
** На очень ранней стадии изучения Python.
источник
Я пытался запустить код, где я хотел читать листы Excel. Проблема была, если есть файл, у которого нет листа с именем скажем: SheetSum Я не могу переместить его в место ошибки !! Код, который я написал, был:
Ошибка выдачи:
Я должен был добавить полный
try except with finally
блок и сказать, чтоfinally
мне нужно закрыть файл в любом случае, как:В противном случае файл по-прежнему остается открытым фоном.
..Больше здесь
источник