假设我想在Python中运行一些函数,确保它是否失败,或者总是运行一些清理代码。像这样的东西:
try: some_function()
finally: cleanup()
好的,很简单。但是撑起来!如果try块中出现任何异常,它们将被抑制。所以这个结构确实比我想要的更多。我真正想做的就是确保一些清理代码在函数之后运行,无论它是否成功完成。我仍然希望我的函数中发生的任何异常都能正常发生。也许这看起来像这样:
do: some_function()
finally: cleanup()
当然,这不是真正的Python代码。我发现这样做的实际方式如下:
try: some_function()
except Exception as error: raise error
finally: cleanup()
Eww,毛。我正在添加一个额外的行来重新抛出一个我想在一开始就正常发生的异常。此外,堆栈跟踪现在还有一条额外的线显示except Exception as error: raise error
位。这对我来说似乎不太理想,但它似乎也是实现我想要做的事情的唯一方法。
如果是,那么我还有一个问题:为什么Python没有专门的构造来简单地确保某些代码块运行是否有其他块成功?
就我的小思想而言,这整个想法与异常处理几乎没有关系,因为我实际上并不希望在堆栈跟踪中通常会发生异常。因此,强迫人们使用try-except-finally构造对我来说似乎很奇怪。
Python做到了!
try:
1/0
finally:
print("Hello, world!")
print("This will not print.")
好吧,所以@ user2357112指出,看起来我似乎有一种疯狂的误解,即try-except-finally构造的try部分是捕获异常的。如果其他人同样感到困惑......那就是捕捉它的除外。经过一番思考后相当明显,但是嘿,每个人都有时脑屁。