1
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 块中返回不是一个好主意。我只是想在敲别人的头之前确定执行顺序!

4

2 回答 2

5

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

你假设错了。a 的全部意义finally在于它总是发生,即使你returnbreak早或提出未处理的异常。* 它发生在.return **之后

这在文档中的 try 语句下进行了解释……但这并不是文档中对新手最友好的部分。


话虽如此,您似乎正在使用一个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视为一个步骤。

于 2013-09-16T20:57:21.750 回答
1

请放心,该finally块始终被执行。return块中的不会try改变这一点。无需敲头;-)

于 2013-09-16T21:01:18.380 回答