尝试并最终在python中

nia*_*loc 0 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))
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 5

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

你错了.的整点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
Run Code Online (Sandbox Code Playgroud)

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

**可能更准确地说它发生在中间return,但我认为这只会增加混乱; 除非你真的在解释翻译的胆量,否则你可以把它想象return成一个步骤.