"""Handle application level errors.""" import logging import traceback from werkzeug.exceptions import NotFound, HTTPException from flask import (Flask, request, jsonify, render_template) from gn_auth.auth.errors import AuthorisationError from .tracing import add_trace from .http import http_error_handlers logger = logging.getLogger(__name__) __all__ = ["register_error_handlers"] def handle_general_exception(exc: Exception): """Handle generic unhandled exceptions.""" logger.error("Error occurred!", exc_info=True) content_type = request.content_type if bool(content_type) and content_type.lower() == "application/json": exc_args = [str(x) for x in exc.args] msg = ("The following exception was raised while attempting to access " f"{request.url}: {' '.join(exc_args)}") return jsonify(add_trace(exc, { "error": type(exc).__name__, "error_description": msg })), 500 return render_template("50x.html", page=request.url, error=exc, trace=traceback.format_exception(exc)), 500 def handle_authorisation_error(exc: AuthorisationError): """Handle AuthorisationError if not handled anywhere else.""" logger.error("Error occurred!", exc_info=True) logger.error(exc) return jsonify(add_trace(exc, { "error": type(exc).__name__, "error_description": " :: ".join(exc.args) })), exc.error_code __error_handlers__ = { Exception: handle_general_exception, AuthorisationError: handle_authorisation_error } def register_error_handlers(app: Flask): """Register ALL defined error handlers""" _handlers = { **__error_handlers__, **http_error_handlers() } for class_, error_handler in __error_handlers__.items(): app.register_error_handler(class_, error_handler)