Files
notytex/exceptions/handlers.py
2025-08-05 06:13:54 +02:00

67 lines
3.0 KiB
Python

from flask import Flask, jsonify, request, current_app, render_template
from pydantic import ValidationError as PydanticValidationError
from domain.exceptions import ValidationError, NotFoundError, BusinessError
from sqlalchemy.exc import IntegrityError, SQLAlchemyError
def register_error_handlers(app: Flask):
"""Enregistre les gestionnaires d'erreurs globaux."""
@app.errorhandler(ValidationError)
def handle_validation_error(error):
current_app.logger.warning(f"Erreur de validation : {error}")
if request.is_json:
return jsonify({'success': False, 'error': str(error)}), 400
return render_template('error.html', error=str(error)), 400
@app.errorhandler(PydanticValidationError)
def handle_pydantic_validation_error(error):
errors = []
for err in error.errors():
field = '.'.join(str(x) for x in err['loc'])
errors.append(f"{field}: {err['msg']}")
message = "Données invalides : " + ", ".join(errors)
current_app.logger.warning(f"Erreur Pydantic : {message}")
if request.is_json:
return jsonify({'success': False, 'error': message, 'details': error.errors()}), 400
return render_template('error.html', error=message), 400
@app.errorhandler(NotFoundError)
def handle_not_found_error(error):
current_app.logger.info(f"Ressource introuvable : {error}")
if request.is_json:
return jsonify({'success': False, 'error': str(error)}), 404
return render_template('error.html', error=str(error)), 404
@app.errorhandler(BusinessError)
def handle_business_error(error):
current_app.logger.warning(f"Erreur métier : {error}")
if request.is_json:
return jsonify({'success': False, 'error': str(error)}), 422
return render_template('error.html', error=str(error)), 422
@app.errorhandler(IntegrityError)
def handle_integrity_error(error):
current_app.logger.error(f"Erreur d'intégrité DB : {error}")
message = "Erreur de données : contrainte de base de données violée"
if request.is_json:
return jsonify({'success': False, 'error': message}), 409
return render_template('error.html', error=message), 409
@app.errorhandler(SQLAlchemyError)
def handle_sqlalchemy_error(error):
current_app.logger.error(f"Erreur SQLAlchemy : {error}")
message = "Erreur de base de données"
if request.is_json:
return jsonify({'success': False, 'error': message}), 500
return render_template('error.html', error=message), 500
@app.errorhandler(500)
def handle_internal_error(error):
current_app.logger.error(f"Erreur interne : {error}")
message = "Erreur interne du serveur"
if request.is_json:
return jsonify({'success': False, 'error': message}), 500
return render_template('error.html', error=message), 500