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块内返回不是一个好主意。我只是想确定执行的顺序,然后我才会抨击某人!
答案 0 :(得分:5)
我假设如果在finally块中发生了某些事情,则在try块内返回不是一个好主意。
你错了。 finally
的重点在于总是,即使您提前return
或break
或提出未处理的异常。*它会发生 之后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
不会改变这一点。不需要头部砰击; - )