Pythonでプログラムを書くときに大切なのが、リソースの正しい解放です。
リソースとは、ファイル、ネットワーク接続、データベース接続など、プログラムが利用する外部の資源のことを指します。
これらのリソースは、使い終わったら必ず解放しなければなりません。 解放しないまま放置すると、メモリ不足やファイルのロックが解除されないといったトラブルの原因になります。
そこで活躍するのがfinally節です。
finally節を使うことで、例外(エラー)が発生した場合でも、リソース解放の処理を必ず実行させることができます。 つまり、予期せぬエラーが起きても「後片付け」を忘れずに行ってくれる仕組みなのです。
finally節は、tryブロックとexceptブロックの後に書きます。
構造は次のようになります。
try:
# 処理を実行
except ExceptionType:
# 例外処理
finally:
# リソースの解放処理
ここで重要なのは、finallyに書いた処理は必ず実行されるという点です。 例外が起きても起きなくても、処理が終了するときに必ずfinallyが呼ばれます。
次に、ファイルを読み込む処理でfinally節を利用する例を見てみましょう。
def read_file(file_name):
file = None
try:
file = open(file_name, 'r')
data = file.read()
print(data)
except FileNotFoundError:
print(f"Error: {file_name} が見つかりません。")
finally:
if file is not None:
file.close()
print(f"{file_name} を閉じました。")
# 使用例
read_file('example.txt')
このサンプルコードでは、まず read_file という関数を定義しています。 この関数は引数としてファイル名を受け取り、そのファイルを読み込んで中身を表示する役割を持っています。
処理の流れを追ってみましょう。
関数の最初ではfile = None
と初期化をしています。
これは、後でfinally節でファイルを閉じる処理を確実に行うための準備です。
次に try ブロックの中でopen(file_name, 'r')
を実行し、対象のファイルを開きます。開いたファイルオブジェクトは file という変数に格納され、その後 read() メソッドを使ってファイルの中身をすべて読み込み、結果をコンソールに出力します。
もし指定したファイルが存在しない場合には FileNotFoundError が発生します。 その場合は except ブロックが呼ばれ、「ファイルが見つかりません」というエラーメッセージを表示します。
そして最後に finally ブロックが実行されます。
ここでは、もし file が None ではなく、つまりファイルが無事に開かれている場合には file.close()
を呼び出し、ファイルを閉じる処理を行います。
この処理は例外が起きても必ず実行されるため、開いたファイルを閉じ忘れる心配がなくなります。
最後に「〇〇を閉じました」というメッセージも表示され、処理が正常に完了したことが確認できます。
もし example.txt というファイルが存在する場合、プログラムを実行すると次のような出力になります。
<example.txt の中身>
example.txt を閉じました。
一方で、もしファイルが存在しない場合は、次のようにエラーが表示されます。
Error: example.txt が見つかりません。
example.txt を閉じました。
ここでも分かる通り、ファイルが存在しなくても最後には必ず finally節 が動作し、リソース解放が行われていることが確認できます。
Pythonで例外処理を行う際に、finally節を活用することは非常に重要です。 ファイルやデータベース、ネットワークなどのリソースは、プログラムが終了する前に必ず解放しなければなりません。
finallyを使えば、例外が発生しても確実にリソースを閉じることができるため、メモリリークやファイルロックといった問題を未然に防ぐことができます。
IT初心者の方は、例外処理を書くときに「try-except-finally」という構造をセットで覚えるとよいでしょう。特に、「必ず後始末をする処理はfinallyに書く」というルールを意識しておけば、安定したプログラムを書く力が身につきます。