在不跳过其余的 try 子句的情况下,是否可以在 try/except 语句中发生异常?

Ran*_*ntz 1 python try-except

假设以下代码:

try:
    code_a
    code_b
    code_c
except:
    pass
Run Code Online (Sandbox Code Playgroud)

如果在 中发生错误code_b,那么它将被 捕获except并且只会code_a运行。有没有办法确保code_c运行?

我想:

try: 
    code_a
except: 
    pass
try: 
    code_b
except: 
    pass
try: 
    code_c
except: 
    pass
Run Code Online (Sandbox Code Playgroud)

不是正确的方法。

Nic*_*ick 5

对标题问题的简短回答是try:否定的。在异常之后,块的其余部分将不会执行。

正如你所注意到的,你可以把code_a,code_bcode_c在他们自己的try:块中并分别处理错误。

你问是否code_c可以运行,即使code_b引发异常。

选项1

完全放在块code_c之外try:

try:
    code_a
    code_b
except:
    pass
code_c
Run Code Online (Sandbox Code Playgroud)

但要小心。code_c绝对不会执行。这取决于except:块中的内容。考虑以下示例:

try:
    code_a
    code_b
except:
    return False
code_c
return True
Run Code Online (Sandbox Code Playgroud)

如果code_acode_b引发异常,code_c则不会执行。

选项 2

使用finally:块:

try:
    code_a
    code_b
except:
    return False
finally:
    code_c
return True
Run Code Online (Sandbox Code Playgroud)

如果code_c在一个finally:块中,无论是否有异常都保证执行。

如果没有异常,则code_ccode_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}')
Run Code Online (Sandbox Code Playgroud)

按写入方式运行时,eggs()引发异常。结果如下:

Ham please
Eggs please
    ...no eggs :(
Spam Spam Spam Spam Spam!
Order complete: False
Run Code Online (Sandbox Code Playgroud)

请注意,即使块中存在 a ,也会执行spam()(in the finally:block) 。return Falseexcept:

以下是raise NoEggsException注释或删除时发生的情况:

Ham please
Eggs please
Spam Spam Spam Spam Spam!
Order complete: True
Run Code Online (Sandbox Code Playgroud)

请注意,无论哪种方式,您的订单中都会收到垃圾邮件(以及更多垃圾邮件)。