假设以下代码:
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)
不是正确的方法。
对标题问题的简短回答是try:否定的。在异常之后,块的其余部分将不会执行。
正如你所注意到的,你可以把code_a,code_b和code_c在他们自己的try:块中并分别处理错误。
你问是否code_c可以运行,即使code_b引发异常。
完全放在块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_a或code_b引发异常,code_c则不会执行。
使用finally:块:
try:
code_a
code_b
except:
return False
finally:
code_c
return True
Run Code Online (Sandbox Code Playgroud)
如果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}')
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)
请注意,无论哪种方式,您的订单中都会收到垃圾邮件(以及更多垃圾邮件)。