python - Python 中不带 goto 的紧急退出

标签 python goto

在 C 中,当发生无法正常处理的异常时,我经常使用 goto 跳出函数中间并解开我在函数中所做的任何事情;例如关闭文件描述符,释放不会使用的已分配内存,例如

error3:
    for(j=0; j<i; j++) {
        nameDelete(names[j]);
    }
error:2
    free(names);
error1:
    close(fd);
error0:
    exit(-1);

在打开 fd 之前的代码早期,当我获取资源时,我会在 error0: 处跳出,稍后在 error1: 处跳出,依此类推。

Python 没有这个结构。相反,我正在查看一个又一个的条件,在这些条件中,我必须一遍又一遍地放入适当的代码,如果我更改函数以在某个时刻获取资源,我需要确保其下面的所有过早退出都能正确处理该资源的某一点。

我不受 goto 语法的束缚(并且我读过 Dijkstra),但是我想知道 Python 中是否有这种操作的通用模式。对 Python in a Nutshell 的(快速)调查并没有多大帮助。

[编辑]

我想避免的是

try:
    foo1
except: 
    bar0
try: 
    foo2
except: 
    bar0
try: 
    foo3
except: 
    bar1
try:
    foo4
except:
    bar2

其中 bar2 包含 bar2 中的所有内容,而 bar2 又包含 bar0 中的所有内容。我承认我在 bar# 中所做的大部分工作很可能是由 GC 处理的,但我更喜欢迂腐,尤其是在重构之前移植代码(这就是我正在做的事情)时。

最佳答案

Python 为此使用异常系统:

raise Exception("ERROR")

这将继续“解开”并清理堆栈,直到异常被异常处理程序捕获。如果没有捕获异常,程序将停止,打印异常并退出。

the official Python tutorial 中了解有关异常的更多信息.

此外,您还描述了资源的使用。这主要通过两种模式来完成:

  • 初始化和清理,资源在初始化时分配,并在释放时释放(方法__init____del__)
  • with 语句,(方法 __enter____exit__)

如果发生异常,两种模式都会正确清理。

关于python - Python 中不带 goto 的紧急退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9008613/

相关文章:

VBA "Compile Error: Label not defined"

python - 导入父目录问题

Python:递归删除超过x天的文件夹

python - 如何在 python 中为 AES 生成强一次性 session key

python - Numba:如何以编程方式打开/关闭即时编译(设置 NUMBA_DISABLE_JIT 环境变量)?

c++ - 我应该避免在这里使用 goto 吗?如果是这样,怎么做?

python - OpenCV 3.1.0 与 Python 3.5

c# - 摆脱多重循环?

java - Java中有goto语句吗?

java - Java中有goto语句吗?