例外処理とは?
プログラムの中でエラーが発生した場合、そこでプログラムが終了してしまいます。
プログラムをエラーで終了させずに処理を実行するには、「 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)