【发布时间】:2012-01-26 06:11:07
【问题描述】:
在 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 的(快速)调查并没有太大帮助。
[编辑]
我要避免的是
try:
foo1
except:
bar0
try:
foo2
except:
bar0
try:
foo3
except:
bar1
try:
foo4
except:
bar2
其中 bar2 包括 bar2 中的所有内容,其中包括 bar0 中的所有内容。我承认我在 bar# 中所做的大部分工作都可能由 GC 处理,但我更喜欢迂腐,尤其是在我重构代码之前移植代码(这就是我正在做的事情)时。
【问题讨论】:
-
你用的是什么 Python 教程?所有这些都应涵盖 try: 和 except 语句。另外,with 语句也做了一些这样的事情。你用的是什么教程?它是否涵盖这些陈述?
-
哎呀——太可怕了,请停下来。 (我说的是你的 C 编码“风格”)
-
@KevinDTimm:它实际上很常见,并且在 linux 内核中被广泛使用。您甚至可能会争辩说,这是在 C 中进行清理的唯一合理且快速的方法。
-
如果你还是要退出进程,是不是不需要进行任何清理? Related: "大楼要拆了,不用扫地、倒垃圾桶、擦白板。"
-
“关闭文件描述符”可能不适用;它通常是自动处理的。 “空闲分配的内存”不适用。您能否提供任何与 Python 相关的具体内容?