例外処理 - Python

  • 作成日:
  • 最終更新日:2025/06/25

例外処理とは?

プログラムの中でエラーが発生した場合、そこでプログラムが終了してしまいます。

プログラムをエラーで終了させずに処理を実行するには、「 try ... except ... 」構文を使います。

次のプログラムを実行すると、ZeroDivisionError というエラーになりプログラムが終了します。

ZeroDivisionError は、ゼロで割り算を行った際に発生するエラーです。

print(100 / 0)

エラーが発生してもそのあとのプログラムを実行するには次のようにします。

try:
  num = 100 / 0
except:
  print("0 で割れません")

print("hello")

主要な Exception

Python にはさまざまな Exception があります。

Exception(例外)は、プログラムの実行中に発生する予期しないエラーや異常な状況のことを指します。

例外名 発生原因
ZeroDivisionError ゼロで割ろうとした
TypeError 型の不一致(数値+文字列)
ValueError 無効な値(int("abc"))
KeyError 辞書に存在しないキーを参照
IndexError リストの範囲外のインデックスにアクセス
AttributeError 存在しない属性をアクセス
FileNotFoundError 指定されたファイルが存在しない
ImportError モジュールのインポート失敗

特定のエラーによって処理を変える

エラーの種類によって処理を分けるには次のようにします。

s = input("入力してください:")
try:
  print(100 / float(s))
except ValueError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except:
  print("その他のエラー")

例外を発生させる

例外を意図的に発生させるには、以下の方法で発生させることができます。

raise Exception("これはエラーです!")

mysql-connector-python で例外を補足

from flask import Flask, jsonify, request
import mysql.connector

app = Flask(__name__)

@app.route('/add_user', methods=['POST'])
def add_user():
    data = request.json
    name = data.get("name")
    age = data.get("age")

    try:
        conn = mysql.connector.connect(
            host="localhost",
            user="root",
            password="yourpassword",
            database="yourdatabase"
        )
        cursor = conn.cursor()
        sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
        cursor.execute(sql, (name, age))
        conn.commit()
        return jsonify({"message": "データ登録成功!"}), 200

    except mysql.connector.errors.IntegrityError:
        return jsonify({"error": "データが重複しています"}), 400
    except mysql.connector.errors.OperationalError:
        return jsonify({"error": "データベース接続エラー"}), 500
    except mysql.connector.errors.ProgrammingError:
        return jsonify({"error": "SQL構文エラー"}), 400
    except mysql.connector.errors.DatabaseError:
        return jsonify({"error": "データベースエラー"}), 500
    except Exception as e:
        return jsonify({"error": f"不明なエラー: {e}"}), 500
    finally:
        if conn.is_connected():
            cursor.close()
            conn.close()

if __name__ == '__main__':
    app.run(debug=True)