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ということです。 * そして、.**の後に発生します。returnbreakreturn

これは、ドキュメントの 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 つのステップと考えることができます。

于 2013-09-16T20:57:21.750 に答える