Pythonのfinallyによる例外処理後の必須実行処理と使い方をわかりやすく解説

スポンサーリンク
スポンサーリンク

finallyの概要

例外処理後の必須実行処理 Python予約語

finally

概要 finally は、tryexcept ブロックの最後に記述し、例外の有無に関係なく必ず実行される処理を定義するためのキーワードです。主に、ファイルやデータベース接続のクローズ処理、リソースの解放などに使用されます。

わかりやすく説明 finally は「エラーが発生しても、していなくても、最後に必ず実行する処理」を指定するものです。例えば、ファイルを開いた場合に、エラーが発生しても確実に閉じる処理を行うことができます。

  • finallytry 内の処理が成功しても失敗しても、必ず実行されます。
  • リソースの解放(ファイルやデータベース接続の終了処理)によく使われます。
  • except ブロックと併用して例外処理を行うことができます。

finallyの基本的な使い方

以下の例では、例外の有無に関わらず finally ブロックの処理が実行されることを示しています。

# finally の基本
try:
    print("処理を開始")
    result = 10 / 2  # 例外なし
except ZeroDivisionError:
    print("ゼロ除算エラー発生")
finally:
    print("処理終了(必ず実行)")
  • 10 / 2 は正常に実行され、エラーは発生しません。
  • finally ブロックの「処理終了(必ず実行)」が実行されます。

exceptと組み合わせたfinallyの使用

例外が発生した場合でも、finally の処理が実行されることを確認します。

# except と finally の組み合わせ
try:
    result = 10 / 0  # ゼロ除算エラー発生
except ZeroDivisionError:
    print("ゼロで割ることはできません")
finally:
    print("プログラム終了(必ず実行)")
  • 10 / 0ZeroDivisionError が発生。
  • except ブロックの「ゼロで割ることはできません」が実行される。
  • finally の「プログラム終了(必ず実行)」が実行される。

finallyを使ったファイル処理

ファイルを開いた後、エラーの有無に関係なく必ずファイルを閉じる例を示します。

# finally を使ったファイル処理
try:
    file = open("sample.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("ファイルが見つかりません")
finally:
    if 'file' in locals():
        file.close()
        print("ファイルを閉じました")
  • ファイルが存在しない場合、FileNotFoundError が発生。
  • エラーの有無にかかわらず finallyfile.close() が実行される。

finallyを使ったデータベース処理

データベース接続を開いた後、エラーの有無に関わらず確実に接続を閉じる例です。

# finally を使ったデータベース処理
import sqlite3

try:
    conn = sqlite3.connect("example.db")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    data = cursor.fetchall()
    print(data)
except Exception as e:
    print(f"エラー発生: {e}")
finally:
    if 'conn' in locals():
        conn.close()
        print("データベース接続を閉じました")
  • データベース操作中にエラーが発生しても、finally で接続が確実に閉じられる。

finallyの注意点

  • finally は必ず実行される: 例外が発生しても、発生しなくても実行されます。
  • return の前に実行される: try 内で return しても、finally は実行されます。
  • リソース管理に役立つ: ファイルやデータベース接続のクローズ処理に便利です。

finallyのよくある質問

Q: finally はなくても大丈夫ですか?
A: はい。ただし、ファイルやデータベース接続の解放が保証されなくなるため、明示的に使うのが安全です。
Q: finally の中で return を使うとどうなりますか?
A: finally 内の return は最優先され、try ブロック内の return を上書きします。
Q: finally を使わずにリソースを解放する方法は?
A: with 構文を使うと、finally なしで安全にリソースを管理できます(例: with open("file.txt", "r") as f:)。

まとめ

finally は、例外の有無にかかわらず、処理の最後に必ず実行されるコードを定義するためのキーワードです。

  • エラーが発生しても finally は必ず実行されます。
  • ファイルやデータベース接続の後処理に便利です。
  • return があっても finally は実行されます。

適切に finally を活用し、プログラムの安定性を向上させましょう。