finallyとelse
このレッスンでできるようになること。try に else と finally を足して、正常だったときだけの処理と、必ず行う後始末を書き分けられるようになります。
try には except のほかに二つの節を付けられます。
else は「try の中で例外が起きなかったとき」だけ動きます。成功したときのログや、次の処理へ進む部分をここへ置きます。try の中に書いてもよさそうですが、try は短いほど「どの行が失敗しうるか」がはっきりします。
finally は「例外が起きても起きなくても」必ず動きます。開いたファイルを閉じる、接続を切るといった後始末の定位置です。途中で return しても finally は実行されるので、閉じ忘れが起きません。
f = None
try:
f = open("kakeibo.txt", "w", encoding="utf-8")
f.write("ノート 250\n")
except ValueError as e:
print("失敗しました", e)
else:
print("書き出しました")
finally:
if f is not None:
f.close()節を並べる順番は try、except、else、finally と決まっています。入れ替えると文法エラーになります。家計簿の保存処理のように「失敗しても後始末は要る」場面では、この形が定番になります。
要件
- lines が空のときは ValueError を投げて受け止め、失敗 保存するデータがありません を記録する
- 書き出せたときは else の節で 成功 件数 行を書き出しました を記録する
- finally の節で開いたファイルを閉じ、後始末を終えました を記録する
- 記録した文字列のリストを返す
入出力例
save_log(["ノート 250","牛乳 180"], "kakeibo_log.txt") → ["成功 2 行を書き出しました","後始末を終えました"]
save_log([], "kakeibo_log.txt") → ["失敗 保存するデータがありません","後始末を終えました"]ヒント
編集 LuaGate編集部