finally 块可以知道是否有异常

kas*_*erd 5 python exception try-finally

在 Python 程序中,我的代码具有以下结构:

try:
    value = my_function(*args)
finally:
    with some_context_manager:
        do_something()
        if 'value' in locals():
            do_something_else(value)
Run Code Online (Sandbox Code Playgroud)

但是'value' in locals()结构感觉有点脆弱,我想知道是否有更好的方法来做到这一点。

我真正想要的是finally根据try块是否引发异常,内部代码的行为略有不同。有没有办法知道是否引发了异常?

mwc*_*ase 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)
Run Code Online (Sandbox Code Playgroud)

现在,如果您要实际处理多个异常,我建议:

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)
Run Code Online (Sandbox Code Playgroud)