没有goto的Python紧急退出

时间:2012-01-25 19:04:05

标签: 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中是否存在这种操作的常见模式。在一个Nutshell中对Python进行的(快速)调查并没有多大帮助。

[编辑]

我想避免的是

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

其中bar2包含bar2中的所有内容,其中包含bar0中的所有内容。我将授予我在bar#中所做的大部分内容很可能由GC处理,但我更倾向于迂腐,特别是在重构代码之前移植代码(这就是我正在做的事情)。

4 个答案:

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

但是你肯定会因此而受到评判,如果这是你的事情:)