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



>假设以下代码:

try:
code_a
code_b
code_c
except:
pass

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

我想:

try: 
code_a
except: 
pass
try: 
code_b
except: 
pass
try: 
code_c
except: 
pass

不是正确的方法。

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

如您所注意的,您可以将code_acode_bcode_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_acode_b引发异常,则不会执行code_c

选项 2

使用finally:块:

try:
code_a
code_b
except:
return False
finally:
code_c
return True

如果code_c位于finally:块中,则无论是否存在异常,它都保证执行。

如果没有异常,code_ccode_acode_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

请注意,即使except:块中有return False,也会执行spam()(在finally:块中(。

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

Ham please
Eggs please
Spam Spam Spam Spam Spam!
Order complete: True

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

您可以使用"final":

try:
print(1)
print(some nonexistent variable)
except:
pass
finally:
print(3)

这将打印"1"和"3">

最新更新