【问题标题】:Try and finally in python尝试并最终在 python 中
【发布时间】:2013-09-16 20:55:38
【问题描述】:
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 块中返回不是一个好主意。我只是想在敲别人的头之前确定执行顺序!

【问题讨论】:

  • finally 块(而不是except 块)中处理异常 有点奇怪。
  • 有什么问题?目前尚不清楚您实际上想学习什么。
  • @raina77ow:同意。我能想象到这样做的唯一原因是如果我需要自定义异常链接(在 Python 3.2+ 中)。

标签: python try-finally


【解决方案1】:

我假设如果 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 视为一个步骤。

【讨论】:

  • 这就是我想知道的。一旦我知道没有例外,我什至会返回 try 块之外。我发现它读起来更清楚。我受够了在这里发现像这样漂浮的垃圾,所以必须猛烈抨击:-) 干杯
  • @nialloc:returntry 块的中间绝对没有问题。来自像 C 这样的语言的人通常认为你应该只在函数末尾有一个 return,这对于 C(至少 C89)是一个好的规则,但对于 Python 来说不是一个好的规则。跨度>
  • 你误会了。我得到了多个返回块,然后我就使用了。在这个例子中,没有必要以这种方式做事。它的垃圾纯粹而简单。这是懒惰,人们只是在不了解他们在做什么或为什么要这样做的情况下,尽其所能让事情发挥作用。最糟糕的开发人员:-)
  • @nialloc:最初的例子确实很草率——尝试将finally 用作except 并不完全是出色或勤奋编码的标志。但是在try 中间返回也不是马虎。这两种情况之间存在区别:如果评估 return 表达式失败,是否应该捕获?如果您了解try 的作用(您继承的编码器可能没有,但您应该知道),您将能够回答这个问题,然后您将return 放在任何合适的地方回答。
【解决方案2】:

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

【讨论】:

  • 嗯,应该试试 -> 除了 -> 返回。必须在返回后回来检查 finally 标志是一场灾难。我只是想绝对确定 finally 块将被执行。头将被猛烈抨击:-)
猜你喜欢
  • 2021-10-02
  • 2021-05-17
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多