106

これは、奇妙な動作をしているコードです。これは、私が書いた動作の単純化されたバージョンです。これはまだ奇妙な動作を示しており、なぜこれが発生しているのかについて具体的な質問がありました.

Windows 7 で Python 2.6.6 を使用しています。

def demo1():
    try:
        raise RuntimeError,"To Force Issue"
    except:
        return 1
    else:
        return 2
    finally:
        return 3

def demo2():
    try:
        try:
            raise RuntimeError,"To Force Issue"
        except:
            return 1
        else:
            return 2
        finally:
            return 3
    except:
        print 4
    else:
        print 5
    finally:
        print 6

結果:

>>> print demo1()
3
>>> print demo2()
6
3
  • デモ 1 が 1 ではなく 3 を返すのはなぜですか?
  • なぜデモ 2 は 6 と 4 または 5 を印刷するのではなく 6 と印刷するのですか?
4

3 に答える 3

143

finallyステートメントが実行されることが保証されているためです(まあ、停電や Python の制御外にあるものはないと仮定します)。これは、関数が戻る前に、別の値を返す finally ブロックを実行する必要があることを意味します。

Python ドキュメントの状態:

return、break、または continue ステートメントが try…finally ステートメントの try スイートで実行されると、finally 句も「途中で」実行されます。</p>

関数の戻り値は、最後に実行された return ステートメントによって決定されます。finally 句は常に実行されるため、finally 句で実行される return ステートメントは常に最後に実行されます。

これは、戻ろうとすると、finallyブロックが呼び出され、持っていたはずの値ではなく、その値が返されることを意味します。

于 2012-06-22T21:09:04.977 に答える