Может ли наконец блокировать узнать, было ли исключение
В программе Python у меня есть код со следующей структурой:
try:
value = my_function(*args)
finally:
with some_context_manager:
do_something()
if 'value' in locals():
do_something_else(value)
Но 'value' in locals()
конструкция кажется немного хрупкой, и мне интересно, есть ли лучший способ сделать это.
Что я действительно хочу, так это для кода внутри finally
вести себя немного по-разному в зависимости от того, try
Блок поднял исключение. Есть ли способ узнать, возникло ли исключение?
3 ответа
Если цель "когда возникло исключение, сделайте что-то другое", как насчет:
exception_raised = False
try:
value = my_function(*args)
except:
exception_raised = True
raise
finally:
with some_context_manager:
do_something()
if not exception_raised:
do_something_else(value)
Теперь, если у вас будет несколько исключений, с которыми вы что-то делаете, я бы порекомендовал:
completed_successfully = False
try:
value = my_function(*args)
else:
completed_successfully = True
finally:
with some_context_manager:
do_something()
if completed_sucessfully:
do_something_else(value)
Вот пара идей:
Установите значение перед попыткой:
value = None
try:
value = my_function(*args)
finally:
with some_context_manager:
do_something()
if value is not None:
do_something_else(value)
Или, если вы хотите установить значение на основе типа исключения:
try:
value = my_function(*args)
except:
value = None
raise
finally:
with some_context_manager:
do_something()
if value is not None:
do_something_else(value)
Присвойте исключение переменной в комплекте исключений, а затем используйте его в окончательном комплекте.
foo = False
try:
raise KeyError('foo not found')
except KeyError as e:
pprint(e)
foo = e
finally:
if foo:
print(foo)
else:
print('NO')