【try, except】Pythonでの例外処理の書き方を解説

Python

本記事では、Pythonでの例外処理の書き方を解説します。例外処理はtry文を用いることで記述できます。なので、try文について説明します。

例外処理とは

例外処理とは、プログラムの実行中に発生する可能性のあるエラー(例外)を適切に処理する仕組みです。例外が発生した場合、通常はプログラムが強制終了してしまいますが、例外処理を行うことで、エラーが発生しても処理を続行したり、適切なメッセージを表示したりすることができます。

例外処理を行うことで以下のメリットがあります。

  • プログラムの堅牢性が向上する
  • ユーザーに対して適切なエラーメッセージを提供できる
  • エラーが発生しても、プログラムを安全に続行できる

try文とは

Pythonでは、try文を使って例外処理を実装します。try文は、エラーが発生する可能性のあるコードブロックを指定し、エラーが発生した場合の対処法を定義します。

try文の基本的な構造は以下の通りです。

  • try: エラーが発生する可能性のあるコードを記述
  • except: エラーが発生した場合に実行するコードを記述
  • else: エラーが発生しなかった場合に実行するコード(オプション)
  • finally: エラーの有無に関わらず、必ず実行されるコード(オプション)

構文

try:
    # エラーが発生する可能性のあるコード
except 例外クラス1:
    # 例外クラス1のエラーが発生した場合に実行するコード
except 例外クラス2:
    # 例外クラス2のエラーが発生した場合に実行するコード
except:
    # どの例外クラスにも一致しないエラーが発生した場合に実行するコード
else:
    # エラーが発生しなかった場合に実行するコード
finally:
    # エラーの有無に関わらず、必ず実行されるコード

基本的なtry-except文の使い方

ゼロ除算を試みた場合に発生するZeroDivisionErrorを捕捉し、エラーメッセージを表示する例です。

try:
    result = 10 / 0  # ゼロで割るとエラーが発生する
except ZeroDivisionError:
    print("ゼロで割ることはできません")

# 出力: ゼロで割ることはできません

複数の例外を処理する例

ユーザー入力を処理する際に発生する可能性のある複数のエラータイプ(ValueError、ZeroDivisionError)を個別に処理する例です。

try:
    num = int(input("数値を入力してください: "))
    result = 100 / num
    print(f"結果: {result}")
except ValueError:
    print("数値を入力してください")
except ZeroDivisionError:
    print("ゼロで割ることはできません")

# 入力が"abc"の場合の出力: 数値を入力してください
# 入力が"0"の場合の出力: ゼロで割ることはできません
# 入力が"5"の場合の出力: 結果: 20.0

else節とfinally節を使った例

ファイルの読み込み処理で、成功時の処理(else)とクリーンアップ処理(finally)を示す例です。ファイルが存在しない場合はFileNotFoundErrorをキャッチします。

try:
    file = open("sample.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("ファイルが見つかりません")
else:
    print("ファイルの読み込みに成功しました")
finally:
    print("この処理は必ず実行されます")
    try:
        file.close()
    except:
        pass  # ファイルが開かれていない場合はスキップ

# ファイルが存在する場合の出力:
# (ファイルの内容)
# ファイルの読み込みに成功しました
# この処理は必ず実行されます

# ファイルが存在しない場合の出力:
# ファイルが見つかりません
# この処理は必ず実行されます

例外情報を取得する例

IndexErrorが発生した場合に、例外オブジェクトから詳細情報を取得して表示する例です。

try:
    numbers = [1, 2, 3]
    print(numbers[5])  # インデックスが範囲外
except IndexError as e:
    print(f"エラーが発生しました: {e}")

# 出力: エラーが発生しました: list index out of range

注意点

エラータイプを明示する

except節に例外クラスを指定せずに使用すると、すべての例外をキャッチしてしまいます。これはバグの発見を困難にするため、可能な限り具体的な例外クラスを指定しましょう。

# 良くない例
try:
    # 何らかの処理
    result = 10 / 0
except:
    print("何らかのエラーが発生しました")  # どんなエラーか分からない

# 良い例
try:
    result = 10 / 0
except ZeroDivisionError:
    print("ゼロで割ることはできません")  # エラーの内容が明確

# 出力(両方とも): ゼロで割ることはできません

例外処理の範囲を適切に設定する

try文の範囲が広すぎると、どこでエラーが発生したのか特定しにくくなります。例外が発生する可能性のある部分だけをtryブロックに含めるようにしましょう。

# 良くない例
try:
    num1 = int(input("1つ目の数値: "))
    num2 = int(input("2つ目の数値: "))
    result = num1 / num2
    print(f"結果: {result}")
except:
    print("エラーが発生しました")  # どの処理でエラーが発生したのか分からない

# 良い例
try:
    num1 = int(input("1つ目の数値: "))
except ValueError:
    print("1つ目の入力は数値である必要があります")
    exit()

try:
    num2 = int(input("2つ目の数値: "))
except ValueError:
    print("2つ目の入力は数値である必要があります")
    exit()

try:
    result = num1 / num2
except ZeroDivisionError:
    print("2つ目の数値はゼロ以外である必要があります")
    exit()

print(f"結果: {result}")

# 各処理でのエラーが明確に分かる

リソースの解放にはfinallyを使用する

ファイルの操作やデータベース接続など、リソースを使用する場合は、finally節でリソースを確実に解放するようにしましょう。

file = None
try:
    file = open("sample.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("ファイルが見つかりません")
finally:
    if file is not None:
        file.close()
        print("ファイルを閉じました")

# ファイルが存在する場合の出力:
# (ファイルの内容)
# ファイルを閉じました

# ファイルが存在しない場合の出力:
# ファイルが見つかりません
# (file.close()は実行されない)

まとめ

Pythonでの例外処理は、try-except-else-finally文を使用して実装します。

  • try: 例外が発生する可能性のあるコードを記述
  • except: 例外が発生した場合の処理を記述
  • else: 例外が発生しなかった場合の処理(オプション)
  • finally: 例外の有無に関わらず実行される処理(オプション)

適切な例外処理を行うことで、プログラムの堅牢性が向上し、ユーザーに対して分かりやすいエラーメッセージを提供できます。また、リソースの適切な解放などを保証することができます。

例外処理を適切に行うことは、実用的なPythonプログラムを書く上で非常に重要なスキルです。状況に応じて適切な例外処理を実装し、安定したアプリケーションを開発しましょう。

タイトルとURLをコピーしました