Может ли наконец блокировать узнать, было ли исключение

В программе 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')
Другие вопросы по тегам