[解決済み] 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
ブロックが呼び出され、持っていたはずの値ではなく、その値を返してしまうということです。
関連
-
[解決済み] すべての例外をキャッチする `try`/`except` ブロックはどのように書けばよいですか?
-
[解決済み] Pythonのtry-else
-
[解決済み] try/exceptを使わずに、文字列がintを表すかどうかを確認するにはどうしたらよいですか?
-
[解決済み] Pythonのリクエストモジュールを使ってtry/exceptする正しい方法?
-
[解決済み】Python。1回の試行で複数回の例外
-
[解決済み】Python try...except のカンマと 'as' を除く。
-
[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複