在 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/