【Python超入門】例外処理の使い方(try、except、else、finally)

Pythonで例外処理を実装する方法について入門者向けにソースコード付きでまとめました。

例外処理

プログラムを実行中に予期せぬエラーが発生した場合、通常はそこで強制終了してしまいます。
しかし、例外処理を使えば、エラーが起きてもプログラムを安全に続行したり、終了処理を行うことができます。

書式

例外処理の実装は、以下のように、try、except、else、finally文を並べて行います。

try:
    # エラーが起こるかもしれない処理
except エラータイプ1:
    # 特定のエラーが起きたときの処理
except エラータイプ2:
    # 別の種類のエラーが起きたときの処理
except:
    # どのexceptにも該当しないその他のエラー(未知のトラブル)
else:
    # エラーが起きなかった場合の処理(正常終了の表示など)
finally:
    # エラーの有無に関係なく必ず実行される処理(ログ保存など)

ファイル読み込み時の例外処理

以下コードは、ファイル読み込み時の例外処理を実装する例です。

try:
    with open("save_data.txt", "r") as f:
        data = f.read()
except FileNotFoundError:
    print("セーブデータが見つかりません。新規スタートします。")
except PermissionError:
    print("読み取り権限がありません。管理者に連絡してください。")
except IOError:
    print("その他のファイル読み込みエラーです。")
else:
    print("セーブデータを正常に読み込みました。")
finally:
    print("ログ:ファイル読み込み処理を終了しました。")
エラー種別 説明
FileNotFoundError 指定したファイルやフォルダが存在しないときに発生するエラー。ファイル名のスペルミス、ディレクトリが存在しないのにファイルを作成しようとした場合などに生じる。
PermissionError ファイルやフォルダにアクセスする権限がないときに発生するエラー。編集しようとしたファイルが「読み取り専用」になっている、書き込み権限のない場所に保存しようとしている場合などに生じる。
IOError その他のファイル読み込み時に発生するエラー。

ファイルが存在しない場合でも、ゲームがクラッシュせず「新規スタート」などの処理に切り替えられます。

リスト操作時の例外処理

以下は、リストからアイテムを取り出す際に発生する可能性のあるエラーを処理する例です。

inventory = ["剣", "弓"]  # 所持アイテムリスト(インデックス 0, 1)

try:
    item = inventory[2]  # インデックス2は存在しない → IndexError発生
    print(f"ぴこりは{item}を装備した!")
except IndexError:
    # リストの範囲外を参照した場合(空スロットなど)
    print("アイテムスロットが空です。")
except TypeError:
    # リストが壊れていた場合(例:None や int を参照しようとした場合)
    print("リストの形式が正しくありません。")
else:
    # エラーがなければ装備成功
    print("アイテム装備成功!")
finally:
    # 成功・失敗に関わらず、ログを出力
    print("ログ:アイテム装備処理を終了しました。")
エラー種別 発生条件と説明
IndexError リストの範囲外を参照したとき(例:inventory[2]
TypeError リストが Noneint など、インデックス操作できない型だったとき

inventory[2] は存在しないため IndexError が発生します。TypeError は、たとえば inventory = None のようにリストが壊れていた場合に発生します。else は例外が発生しなかったときのみ実行され、finally は常に実行されます。

数値変換時の例外処理

以下は、ユーザーの入力を数値に変換する際に発生する可能性のあるエラーを処理する例です。
たとえば、RPGのレベル入力で「やくそう」などの文字列が入ってしまった場合などに備えます。

user_input = "やくそう"  # ユーザーが入力した値(今回は文字列)

try:
    level = int(user_input)  # 数値に変換を試みる
except ValueError:
    # 数値に変換できない文字列(例:「やくそう」)が入力された場合
    print("レベル入力が無効です。数値を入力してください。")
except TypeError:
    # None やリストなど、int() に渡せない型が入力された場合
    print("入力形式が不正です。")
else:
    # エラーがなければ正常にレベルを表示
    print(f"レベル{level}でスタートします!")
finally:
    # 成功・失敗に関わらず、ログを出力
    print("ログ:レベル入力処理を終了しました。")
エラー種別 発生条件と説明
ValueError 数値に変換できない文字列が渡されたとき(例:"やくそう""abc"
TypeError Nonelist など、int() に渡せない型が渡されたとき(例:int(None)

関連ページ(もっと学びたい人へ)

Pythonの基礎から応用例まで、以下ページから学ぶことができます。

【Python超入門】基礎から応用例まで幅広く解説
PythonについてPythonは、統計処理や機械学習、ディープラーニングといった数値計算分野を中心に幅広い用途で利用されているプログラミング言語です。他のプログラミング言語と比較して「コードが短くて読みやすい、書きやすい」「ライブラリが豊...
この記事を書いた人
西住技研

プログラミング言語「Python」を研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
筆者の詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
Python基礎

コメント