异常后的清理
我有一段代码,大概是这样的:
try:
fn()
except ErrorA as e:
... do something unique ...
cleanup()
except ErrorB as e:
... do something unique ...
cleanup()
except ErrorC as e:
... do something unique ...
cleanup()
在Python里,有没有什么方法可以让我在出现错误的时候,只调用一次cleanup
这个函数?也就是说,跟else
正好相反。
我能想到的最好办法是:
error = True
try:
fn()
error = False
except ErrorA as e:
... do something unique ...
except ErrorB as e:
... do something unique ...
except ErrorC as e:
... do something unique ...
if error:
cleanup()
3 个回答
2
你可以用一个 except
语句来捕捉所有的错误,然后用 if/elif
来区分不同的处理方式,这样做怎么样呢?
try:
fn()
except (ErrorA, ErrorB, ErrorC) as e:
if isinstance(e, ErrorA):
... do something unique ...
elif isinstance(e, ErrorB):
... do something unique ...
else: # isinstance(e, ErrorC)
... do something unique ...
cleanup()
2
我想到的最简单的方法就是做else
的完全相反的事情:
do_cleanup = True
try:
fn()
except ErrorA as e:
... do something unique ...
except ErrorB as e:
... do something unique ...
except ErrorC as e:
... do something unique ...
else:
do_cleanup = False
if do_cleanup:
cleanup()
如果代码是被包裹起来的,并且可以顺利执行,你可以通过在else
中使用返回或者中断来简化它。
4
在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,特别是当我们不太熟悉这些工具的工作原理时。
比如说,有些人可能在使用某个特定的功能时,发现它并没有按照预期的方式工作。这时候,他们可能会在网上寻找解决方案,像是在StackOverflow这样的平台上提问。
在提问的时候,提供一些背景信息是很重要的,比如你在做什么、遇到了什么具体的问题,以及你尝试过哪些解决办法。这样,其他人才能更好地理解你的问题,并给出有效的建议。
总之,遇到问题时,不要害怕寻求帮助,记得把你的问题描述清楚,这样才能更快找到解决方案。
def _cleanup():
# clean it up
return
cleanup = _cleanup
try:
# stuff
except:
# handle it
else:
cleanup = lambda: None
cleanup()