>假设以下代码:
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_a
、code_b
和code_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_a
或code_b
引发异常,则不会执行code_c
。
选项 2
使用finally:
块:
try:
code_a
code_b
except:
return False
finally:
code_c
return True
如果code_c
位于finally:
块中,则无论是否存在异常,它都保证执行。
如果没有异常,code_c
在code_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}')
按写入方式运行时,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">