异常后的清理

1 投票
3 回答
3219 浏览
提问于 2025-04-18 09:29

我有一段代码,大概是这样的:

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()

撰写回答