1. ホーム
  2. python

[解決済み] Python try finally ブロックは [重複] を返します。

2023-01-15 11:52:05

質問

以下に面白いコードがあります。

def func1():
    try:
        return 1
    finally:
        return 2

def func2():
    try:
        raise ValueError()
    except:
        return 1
    finally:
        return 3

func1()
func2()

どなたか、これらの2つの関数がどのような結果を返すのか、またその理由を説明していただけないでしょうか。

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

Pythonから ドキュメント

<ブロッククオート

finally節は、例外が発生したかどうかに関わらず、常にtry文から離れる前に実行されます。try節で例外が発生し、except節で処理されなかった場合(あるいはexcept節やelse節で発生した場合)、finally節が実行された後に例外が再発生します。finally節は は、try 文の他の節が break、continue、return 文によって残されたときにも、「途中で」実行されます。 . より複雑な例です(同じtry文の中にexceptとfinally節があるのはPython2.5で動作しています)。

というわけで、try/except ブロックは、一旦 を返す を使うと、返り値を指定することになります - 最終ブロックは 常に を実行し、リソースの解放などに使用されるべきですが、そこで別の戻り値を使用すると、元のものが上書きされます。

あなたの特定のケースでは func1() 戻る 2 そして func2() を返す 3 のように、これらはfinallyブロックで返される値です。