Pythonのエラー処理完全ガイド:try, except, raiseを使いこなす

Pythonの例外処理(try, except, raise)を初心者向けに解説。エラーの種類、基本的な使い方、応用例、デバッグのコツを紹介。実践的なサンプルコード付き。

Pythonエラーtryexcept例外デバッグ2026/5/25

Pythonのエラー処理とは?

Pythonでプログラムを書いていると、予期しないエラー(例外)が発生することがあります。例えば、ゼロで割り算をしようとしたり、存在しないファイルを開こうとしたりするとエラーになります。こうしたエラーを適切に処理しないと、プログラムが途中で止まってしまいます。そこで役立つのが try, except, raise を使った例外処理です。

この記事では、Pythonのエラー処理の基本から応用までを、具体的なコード例を交えて解説します。

エラーの種類:構文エラーと例外

Pythonのエラーは大きく2つに分けられます。

  • 構文エラー (SyntaxError):Pythonの文法が間違っている場合に発生します。例えば、コロンが抜けていたり、括弧が閉じていなかったりします。これはプログラムを実行する前にPythonが検出するため、try-exceptでは捕捉できません。
  • 例外 (Exception):プログラムの実行中に発生するエラーです。代表的なものに ZeroDivisionError(ゼロ除算)、FileNotFoundError(ファイルが見つからない)、TypeError(型が合わない)などがあります。これらはtry-exceptで処理できます。
  • try-exceptの基本

    例外が発生しそうなコードを try ブロックで囲み、例外が発生した場合の処理を except ブロックに書きます。

    try:
        result = 10 / 0
    except ZeroDivisionError:
        print("ゼロで割ることはできません")
    

    この例では、ZeroDivisionError が発生したときにだけ、exceptブロックが実行されます。エラーが発生しなければ、exceptブロックはスキップされます。

    複数の例外を捕捉する

    異なる種類の例外をまとめて捕捉したい場合は、タプルで指定します。

    try:
        num = int(input("数字を入力: "))
        result = 10 / num
    except (ValueError, ZeroDivisionError) as e:
        print(f"エラーが発生しました: {e}")
    

    ValueError は整数に変換できないとき、ZeroDivisionError はゼロで割ったときに発生します。

    全ての例外を捕捉する

    基底クラス Exception を使うと、ほとんどの例外を捕捉できます。ただし、あまり広範囲に捕捉すると、予期しないバグを見逃す可能性があるため注意が必要です。

    try:
        # 何らかの処理
    except Exception as e:
        print(f"エラー: {e}")
    

    else節とfinally節

    try-exceptには elsefinally を追加できます。

  • else:例外が発生しなかった場合に実行されます。
  • finally:例外の有無にかかわらず必ず実行されます(ファイルクローズなどに使います)。
  • try:
        file = open("sample.txt", "r")
        data = file.read()
    except FileNotFoundError:
        print("ファイルが見つかりません")
    else:
        print("ファイルの読み込みに成功しました")
    finally:
        file.close()
        print("ファイルを閉じました")
    

    raiseで意図的に例外を発生させる

    raise を使うと、自分で例外を発生させることができます。例えば、関数の引数が不正な場合にエラーを通知したいときに使います。

    def divide(a, b):
        if b == 0:
            raise ValueError("除数は0にできません")
        return a / b
    

    try: result = divide(10, 0) except ValueError as e: print(e)

    また、raise 単体で使うと、現在の例外をそのまま再送出できます。

    try:
        # 例外が発生する処理
    except:
        # ログを残すなど
        raise  # 同じ例外を再送出
    

    カスタム例外の作成

    既存の例外クラスを継承して、独自の例外を作成できます。

    class MyCustomError(Exception):
        pass
    

    try: raise MyCustomError("これはカスタムエラーです") except MyCustomError as e: print(e)

    実践的なエラー処理の例

    ファイル操作

    import sys
    

    def read_file(filename): try: with open(filename, "r") as f: return f.read() except FileNotFoundError: print(f"ファイル {filename} が見つかりません", file=sys.stderr) return None except PermissionError: print(f"ファイル {filename} を読み込む権限がありません", file=sys.stderr) return None

    数値入力の検証

    def get_positive_integer():
        while True:
            try:
                num = int(input("正の整数を入力: "))
                if num <= 0:
                    raise ValueError("正の整数ではありません")
                return num
            except ValueError as e:
                print(f"無効な入力です: {e}")
    

    デバッグのコツ

  • トレースバックを読む:エラーが発生した場所と原因が表示されます。
  • ログを残すlogging モジュールを使ってエラー情報を記録すると後で分析しやすいです。
  • assert文:デバッグ中に条件をチェックするのに便利です。
  • def square_root(x):
        assert x >= 0, "負の数の平方根は計算できません"
        return x ** 0.5
    

    まとめ

    Pythonのエラー処理は、プログラムを堅牢にするために欠かせません。

  • try-except で例外を捕捉
  • else で成功時の処理
  • finally で後片付け
  • raise で例外を発生・再送出
  • カスタム例外でエラーを明確に
  • 適切なエラー処理を書くことで、ユーザーに優しいプログラムになります。ぜひ実践で活用してみてください。