Краткий ответ на ваш вопрос в заголовке: «Нет». Остальная часть блока try:
не будет выполняться после исключения.
Как вы заметили, вы можете поместить code_a
, code_b
и code_c
в свои собственные блоки try:
и обрабатывать ошибки отдельно.
Вы спросили, может ли code_c
работать, даже если code_b
вызвало исключение.
Опция 1
Поместите code_c
полностью вне блока try:
:
try:
code_a
code_b
except:
pass
code_c
Но будьте осторожны. code_c
точно не будет выполняться. это зависит от того, что находится в блоке except:
. Рассмотрим следующий пример:
try:
code_a
code_b
except:
return False
code_c
return True
Если code_a
или code_b
вызывают исключение, code_c
не будет выполняться.
Вариант 2
Используйте блок finally:
:
try:
code_a
code_b
except:
return False
finally:
code_c
return True
Если code_c
находится в блоке finally:
, он гарантированно выполнится независимо от того, есть ли исключение.
Если исключения нет, code_c
выполняется после code_a
и code_b
.
Если есть исключение, return False
будет работать, как и ожидалось, НО code_c
втиснется и выполнится непосредственно перед возвратом функции. Это связано с тем, что гарантировано выполнение.
Полный пример
def ham():
print('Ham please')
def eggs():
print('Eggs please')
raise NoEggsException
class NoEggsException(Exception):
pass
def spam():
print('Spam Spam Spam Spam Spam!')
def order():
try:
ham()
eggs()
except NoEggsException:
print(' ...no eggs :(')
return False
finally:
spam()
return True
if __name__ == '__main__':
order_result = order()
print(f'Order complete: {order_result}')
При запуске, как написано, eggs()
вызывает исключение. Результат выглядит следующим образом:
Ham please
Eggs please
...no eggs :(
Spam Spam Spam Spam Spam!
Order complete: False
Обратите внимание, что spam()
(в блоке finally:
) выполняется, несмотря на то, что в блоке except:
есть return False
.
Вот что происходит, когда raise NoEggsException
закомментирован или удален:
Ham please
Eggs please
Spam Spam Spam Spam Spam!
Order complete: True
Обратите внимание, что вы получаете спам (и многое другое spam) в любом случае.
person
Nick
schedule
01.07.2020
finally
то, что вы хотите? - person Karl Knechtel   schedule 01.07.2020with
в Python (stackoverflow.com/a/3012565/2480947). Часто это проще, чем использовать блокtry
- person Nick   schedule 02.07.2020eval()
в операторе try-except кажется кратким решением этой проблемы (хотя я думаю, чтоeval()
иногда может быть туманным). - person Randy Sterbentz   schedule 02.07.2020