尝试并最终在python中

时间:2013-09-16 20:55:38

标签: python try-finally

def connect(self):
    ok = False
    try:
        conn = ftplib.FTP(self.hostname, self.user, self.password)
        ok = True
        return conn
    finally:
        if not ok:
            logging.error('Failed to connect to %s for %s' % (self.hostname, self.user))

我假设如果finally块中发生了某些事情,则在try块内返回不是一个好主意。我只是想确定执行的顺序,然后我才会抨击某人!

2 个答案:

答案 0 :(得分:5)

  

我假设如果在finally块中发生了某些事情,则在try块内返回不是一个好主意。

你错了。 finally的重点在于总是,即使您提前returnbreak或提出未处理的异常。*它会发生 之后return。**

这在文档中的The try statement下进行了解释......但这并不是文档中最适合新手的部分。


话虽如此,您似乎正在使用finally块来伪造except块。您可以在finally时检查是否存在异常,而只是使用异常本身告诉您存在异常:

def connect(self):
    try:
        conn = ftplib.FTP(self.hostname, self.user, self.password)
        return conn
    except Exception as e:
        logging.error('Failed to connect to %s for %s' % (self.hostname, self.user))
        raise

*那"总是"真的只是在极限范围内。如果你的程序调用一些C代码来解析翻译器,或者你明确地调用了_exit,或者有人在程序中间拉了电源线,那么finally代码显然不会运行。

**在return中间发生这种情况可能会更准确,但我认为这只会增加混乱;除非你真正在解释翻译的内容,否则你可以将return视为一步。

答案 1 :(得分:1)

请放心,finally块始终执行。 return块中的try不会改变这一点。不需要头部砰击; - )