Pythonのfinally文を徹底解説!例外発生時でも実行される処理の書き方と使い方
生徒
「Pythonでエラーが起きたときにも必ず実行される処理ってあるんですか?プログラムが途中で止まると困ってしまいます。」
先生
「ありますよ。そのために使うのがfinally文です。例外が発生しても発生しなくても、最後に必ず実行される場所を作れる仕組みなんです。」
生徒
「必ず実行されるというのは便利ですね。どういうときに使うんですか?」
先生
「たとえばファイルを閉じたり、接続を切ったり、片付け作業を行いたいときに使うんです。実際の書き方を一緒に見ていきましょう。」
1. finally文とは?例外処理の「最後の砦」を理解しよう
Pythonのfinally文は、例外処理(エラー対策)において「何があっても、最後に必ず実行される処理」を記述するための構文です。tryブロックの中でエラー(例外)が発生した場合はもちろん、エラーが全く起きずに正常に処理が終了した場合でも、finallyに書いたコードは漏れなく実行されます。
プログラミング未経験の方には、「キャンプの片付け」をイメージすると分かりやすいでしょう。料理が上手くいっても(正常終了)、途中で雨が降って中止になっても(エラー発生)、借りた道具を返したりゴミを拾ったりする「後片付け」は絶対に必要ですよね。Pythonにおけるfinallyは、まさにその「後片付け」を担当する大切な役割を持っています。
まずは、非常にシンプルな例で動きを確認してみましょう。例えば、数字を扱うプログラムで考えてみます。
try:
print("--- 処理を開始します ---")
# ここでエラーが起きる可能性があります
result = 10 / 2
print(f"計算結果は {result} です")
except:
print("エラーが発生しました!")
finally:
# エラーの有無に関わらず、必ず実行されます
print("--- すべての工程が終了しました(後片付け) ---")
このコードを動かすと、計算が成功しても、仮に「10 / 0」のようにエラーが起きる計算に変えても、一番最後のメッセージは必ず表示されます。このように、プログラムの実行状態をクリーンに保つための「終了の合図」や「リソースの解放」を記述する場所がfinallyなのです。この仕組みがあるおかげで、予期せぬトラブルでプログラムが止まっても、システム全体が不安定になるのを防ぐことができます。
2. 基本的なfinally文の書き方と処理の流れ
Pythonでfinallyを使用する際は、try(やってみる)、except(エラーが起きたら)、finally(最後に必ず)という3つのブロックをセットで考えるのが基本です。この構文を使うことで、予期せぬエラーでプログラムが強制終了しそうな場面でも、安全に処理を締めくくることができます。
まずは、プログラミング未経験の方でもイメージしやすい「文字列を数値に変換する」という具体例で、実際の書き方と動作を確認してみましょう。
try:
# 1. まずはこの処理を実行(エラーが起きる可能性があるもの)
print("データの変換を試みます...")
number = int("Python") # 文字列を数字にしようとしてエラーが発生!
print(f"変換結果: {number}")
except Exception as e:
# 2. エラーが発生した場合にここが実行される
print(f"【エラー発生】数字以外のものは変換できません(理由: {e})")
finally:
# 3. 成功しても失敗しても、最後に必ず実行される
print("--- 変換処理の試行が完了しました(終了処理) ---")
このプログラムを実行すると、int("Python")の行で「文字を数字にはできないよ!」というエラーが発生します。そのため、直後のprint(f"変換結果...")は飛ばされてexceptブロックへ移動しますが、どんな状況になっても最後のfinallyブロックだけはスキップされずに実行されます。
この「何があっても通る道」があることで、画面に終了メッセージを出したり、使い終わったメモリを整理したりといった、プログラムの整合性を保つための重要な操作を確実に実行できるのです。例外処理の基本形として、この3ステップの形を覚えておきましょう。
3. ファイル処理でのfinallyの活用例:リソース解放の重要性
初心者の方がfinallyの恩恵を最も実感しやすいのが、「ファイルの読み書き(ファイル操作)」の場面です。コンピュータ上のファイルを開いて中身を読み取るとき、Pythonは内部でそのファイルへの接続(パス)を確保します。これを「リソースを確保する」と呼びます。
ここで重要なルールが1つあります。それは、「開いたファイルは、必ず最後に見やすく閉じなければならない(closeする)」ということです。もしファイルを閉じ忘れると、メモリを無駄に消費したり、他のプログラムがそのファイルを開けなくなったりする不具合(リソースリーク)の原因になります。しかし、ファイルの読み込み中に予期せぬエラーが発生すると、close()の命令にたどり着く前にプログラムが止まってしまうことがあります。
そこでfinallyの出番です。以下のコードで、安全なファイル処理の書き方を見てみましょう。
try:
# 1. ファイルを開く
print("ファイルをオープンします...")
f = open("sample.txt", "r", encoding="utf-8")
# 2. 中身を読み込む(ここでエラーが起きる可能性がある)
data = f.read()
print("ファイルの内容を読み込みました")
print(data)
except FileNotFoundError:
# ファイルが存在しない場合のエラー対処
print("【警告】指定されたファイルが見つかりません。")
except Exception as e:
# その他の予期せぬエラーが発生した場合
print(f"【エラー】読み込み中にトラブルが発生しました: {e}")
finally:
# 3. 成功しても失敗しても、最後に必ず実行される
# 変数fが存在し、かつ閉じられていない場合に確実に閉じる
if 'f' in locals() and not f.closed:
f.close()
print("リソースを解放しました(ファイルを閉じました)")
この書き方をすれば、たとえ「読み込み権限がない」「途中で文字化けエラーが起きた」といったトラブルに見舞われても、finallyブロックが確実に実行されます。プログラムが異常終了しそうになっても、最後にそっとファイルを閉じて「後片付け」を済ませてくれるのです。
実際のシステム開発現場では、こうした「万が一」への備えがプログラムの信頼性を左右します。finallyに後処理を書く習慣をつけるだけで、プロフェッショナルなコードに一歩近づくことができますよ。
4. ネットワーク接続やデータベース接続でも必須:リソース解放の重要性
ファイル操作以外にも、finallyがプロの現場で必ず使われる場面があります。それが「ネットワーク通信」や「データベースへの接続」です。これらは外部のコンピュータやシステムと「土管(コネクション)」をつないでデータをやり取りするイメージです。
もし、データの取得中にエラーが起きて接続を「開きっぱなし」にしてしまうと、システムが重くなったり、他のユーザーが接続できなくなったりする、いわゆる「リソース漏洩(リーク)」が発生します。これを防ぐために、成功・失敗を問わず、最後に必ず「接続を閉じる(切断する)」という後片付けが不可欠なのです。
try:
print("データベースに接続します...")
# 実際にはここでIDやパスワードを使って接続します
is_connected = True
print("データを取得中...")
# ここで予期せぬ通信エラーが発生したと仮定します
raise Exception("通信が途絶えました")
except Exception as e:
print(f"【トラブル発生】通信に失敗しました: {e}")
finally:
# 接続が開いているなら、どんな状況でも必ず閉じる
if 'is_connected' in locals() and is_connected:
print("データベース接続を安全に切断しました。")
print("サーバーの負荷を解放し、処理を終了します。")
初心者のうちは「動けばいい」と考えがちですが、Webサービスなどの大規模なシステムでは、この数行のfinallyがあるかどうかが、システムの安定性を左右します。「使い終わったら元に戻す」という現実世界のルールを、プログラムの世界で確実に守るための仕組みがfinallyなのです。この習慣を身につけるだけで、あなたの書くコードの信頼性は格段に向上します。
5. exceptを省略した「try-finally」:エラー処理をせず後片付けだけ行う方法
例外処理といえば try-except が定番ですが、実は except を書かずに try-finally だけを組み合わせて使うことも可能です。これは「エラーが発生したときの特別な対応(例外のキャッチ)」は必要ないけれど、「エラーが起きようが起きまいが、この後始末だけは絶対にやってほしい」という場面で非常に重宝します。
プログラミング未経験の方には、「料理の途中で火事(エラー)が起きても、キッチンの窓を閉める(後処理)ことだけは忘れない」という状況をイメージすると分かりやすいでしょう。エラー自体はシステム側に報告(スロー)させつつ、自分はクリーンアップだけを担当する役割です。
try:
print("--- 重要なシステム処理を開始 ---")
# ここでエラーが発生しても、あえてexceptで捕まえません
result = 100 / 0 # ゼロ除算エラーが発生!
print(f"結果: {result}")
finally:
# エラーでプログラムが止まる直前に、ここが必ず動きます
print("【強制実行】ログを保存し、安全に終了準備を整えました。")
このコードを実行すると、ゼロ除算のエラー(ZeroDivisionError)でプログラムは最終的に止まってしまいます。しかし、止まる直前に必ず finally の中身が実行されます。
「エラーは発生させてプログラムを停止させたい(バグを知らせたい)、でも開いたファイルや接続は閉じておかないと困る」といった、データの整合性を守るためのテクニックとして、中級者以上の開発現場でも頻繁に使われる書き方です。
6. finallyはreturnよりも優先して実行される
Pythonのfinallyはとても強力で、なんと関数内のreturnよりも優先されます。つまり、関数が終了しようとしても、finallyが先に実行されます。
def sample():
try:
return "tryのreturn"
finally:
print("finallyが先に実行されます")
print(sample())
実行すると、まずfinallyのメッセージが表示され、その後にreturnの値が返されます。この性質を理解しておくと、処理の流れが読みやすくなるので覚えておくと役に立ちます。
7. 初心者がfinallyを使う際に意識すべきポイント
初心者のうちは、エラーが出るとプログラムが止まってしまい不安に感じることが多いと思います。しかしfinallyを使えば、たとえ途中でエラーが起きても必ず後処理が行われるため、安心してコードを書くことができます。
また、プログラムが複雑になるほど「必ず実行したい処理」が増えるため、finallyの重要性はどんどん高くなります。安全にプログラムを書けるようになるために、try-except-finally構文はPythonの初心者が最初に身につけておきたい基本スキルのひとつです。
まとめ
Pythonのfinally文の役割と重要性の総まとめ
本記事では、Pythonのfinally文について、例外処理の基本から実務での活用方法までを初心者向けに詳しく解説してきました。Pythonのfinally文は、エラーの有無に関係なく必ず最後に実行される処理を記述できる非常に重要な構文です。プログラムが正常に終了した場合でも、途中で例外が発生した場合でも、必ず後処理が実行されるという特徴があります。
この仕組みにより、ファイルのクローズ処理やデータベース接続の切断、ネットワークの後片付けなど、リソース解放を確実に行うことができます。Python初心者の方にとっては、finally文は「最後の後片付けをする場所」として理解するのが分かりやすく、安全なプログラムを書くための第一歩となります。
try except finallyの流れと処理の理解
Pythonの例外処理では、tryで処理を実行し、問題が発生した場合はexceptで対応し、最後にfinallyで必ず実行したい処理を記述します。この流れを理解することで、プログラムの動作を正確にコントロールできるようになります。
特に重要なのは、finallyは例外が発生しても必ず通るという点です。この特徴により、プログラムの終了処理を安全に保証できるため、実務でも頻繁に利用されます。初心者の方は、まずこの流れをしっかり理解することが大切です。
サンプルプログラムで理解するfinally文の応用
次に、ファイル処理と例外処理を組み合わせた実践的なサンプルコードを紹介します。finally文がどのように役立つかを確認してみましょう。
try:
print("ファイルを開きます")
f = open("data.txt", "r", encoding="utf-8")
content = f.read()
print(content)
except FileNotFoundError:
print("ファイルが見つかりません")
finally:
if 'f' in locals() and not f.closed:
f.close()
print("ファイルを閉じました")
このように、例外が発生しても発生しなくても、finallyの中の処理が必ず実行されるため、安全にファイルを扱うことができます。これがPythonのfinally文の大きなメリットです。
finally文を使うメリットと実務での活用
finally文を使う最大のメリットは、プログラムの終了処理を確実に実行できることです。特に、外部リソースを扱う場合には、処理の途中でエラーが発生しても必ず解放処理を行う必要があります。これを怠ると、メモリの無駄遣いやシステムの不具合につながる可能性があります。
また、finally文を活用することで、コードの意図が明確になり、可読性も向上します。「ここは必ず実行される処理である」ということが一目で分かるため、他の開発者にも理解しやすいコードになります。
初心者が理解しておくべきポイント
Python初心者の方がfinally文を学ぶ際には、「必ず実行される」という特徴をしっかり意識することが重要です。エラーが起きても処理を完全に終わらせるための仕組みとして活用することで、安全なプログラムを書くことができます。
また、returnよりもfinallyが先に実行されるという特徴も重要なポイントです。この動作を理解しておくことで、処理の流れを正確に把握できるようになります。
finally文はシンプルな構文ですが、実務では非常に重要な役割を持っています。今回学んだ内容を繰り返し使いながら、自然に使いこなせるようにすることが大切です。
生徒
「finally文って、どんなときでも最後に実行されるのがすごいですね。」
先生
「そうですね。だからこそ後処理を書く場所としてとても重要なんです。」
生徒
「ファイルを閉じる処理や接続を切る処理に使う理由も分かりました。」
先生
「はい。リソースの解放はプログラムの安定性に直結するので、必ず覚えておきましょう。」
生徒
「returnよりも先に実行されるのも印象的でした。」
先生
「その理解があれば、処理の流れをしっかりコントロールできるようになりますよ。」