1. ホーム
  2. python

[解決済み] ReturnステートメントでのTry-Except-Else-Finallyの奇妙な挙動

2022-11-21 21:54:49

質問

特殊な動作をするコードがあります。これは、私が書いた動作の簡略化されたバージョンです。これはまだ奇妙な動作を示すもので、なぜこのようなことが起こるのかについていくつかの具体的な質問がありました。

Windows7でPython2.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

  • なぜ demo one は 1 ではなく 3 を返すのですか?
  • なぜデモ 2 は 6 を表示するのではなく、6 を 4 または 5 と表示するのですか?

どのように解決するのですか?

なぜなら finally ステートメントは 保証されています。 は実行されることが保証されています(まあ、停電やPythonの制御外のことがないことを前提にしていますが)。これは、関数が戻る前に、異なる値を返すfinallyブロックを実行しなければならないことを意味します。

Pythonドキュメント の状態になります。

try...finally文のtryスイートでreturn, break, continue文が実行されると、finally句も「途中で」実行される。

関数の戻り値は、最後に実行されたreturn文によって決定されます。finally節は常に実行されるので、finally節で実行されたreturn文は常に最後に実行されたものになる。

つまり、returnしようとしたときに finally ブロックが呼び出され、持っていたはずの値ではなく、その値を返してしまうということです。