在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中是否存在这种操作的常见模式。在一个Nutshell中对Python进行的(快速)调查并没有多大帮助。
[编辑]
我想避免的是
try:
foo1
except:
bar0
try:
foo2
except:
bar0
try:
foo3
except:
bar1
try:
foo4
except:
bar2
其中bar2包含bar2中的所有内容,其中包含bar0中的所有内容。我将授予我在bar#中所做的大部分内容很可能由GC处理,但我更倾向于迂腐,特别是在重构代码之前移植代码(这就是我正在做的事情)。
答案 0 :(得分:4)
Python使用异常系统:
raise Exception("ERROR")
这将继续“解开”并清理堆栈,直到异常处理程序捕获异常为止。如果没有捕获异常,程序将停止,打印异常并退出。
详细了解the official Python tutorial中的例外情况。
另外,您描述了资源的使用。这是通过两种模式完成的:
__init__
和__del__
)with
声明,(方法__enter__
和__exit__
)如果发生异常,两种模式都会正确清理。
答案 1 :(得分:0)
我不确定我是否完全了解您的需求,但听起来您可以使用try ... except ... finally
在此处详细了解异常和异常处理:http://docs.python.org/tutorial/errors.html
答案 2 :(得分:0)
如果您需要处理错误,请使用例外。官方Python手册中的示例:
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
顺便说一句,您可以在需要时提出自己的自定义异常。
答案 3 :(得分:0)
除了异常之外,with
语句通常特别用于文件描述符。
http://effbot.org/zone/python-with-statement.htm
http://docs.python.org/reference/compound_stmts.html#the-with-statement
仅供参考,虽然这是“不好的做法”,但文件对象一旦获得GCed就会立即关闭,只要它们超出范围就会立即关闭,只要你没有其他引用它们。所以这实际上不会打开文件:
def _readfile():
f = open("path")
return f.read()
但是你肯定会因此而受到评判,如果这是你的事情:)