| import logging | |
| import traceback | |
| from django.http import JsonResponse | |
| logger = logging.getLogger(__name__) | |
| class ExceptionMiddleware: | |
| """ | |
| Middleware to catch exceptions and handle them with appropriate logging and JSON response. | |
| """ | |
| def __init__(self, get_response): | |
| """ | |
| Initializes the ExceptionMiddleware with the provided get_response function. | |
| """ | |
| self.get_response = get_response | |
| def __call__(self, request): | |
| """ | |
| Process the request and call the next middleware or view function in the chain. | |
| """ | |
| response = self.get_response(request) | |
| return response | |
| def process_exception(self, request, exception): | |
| """ | |
| Called when a view function raises an exception. | |
| """ | |
| error_type = exception.__class__.__name__ | |
| error_message = exception.args | |
| logger.info(f"Error Type: {error_type} | Error Message: {error_message}") | |
| logger.debug("Request Details: %s", request.__dict__) | |
| logger.exception(traceback.format_exc()) | |
| if isinstance(exception, KeyError): | |
| status_code = 400 | |
| message = f"Please Add Valid Data For {error_message[0]}" | |
| error = "BAD_REQUEST" | |
| elif isinstance(exception, AttributeError): | |
| status_code = 500 | |
| message = "Something Went Wrong. Please try again." | |
| error = "SOMETHING_WENT_WRONG" | |
| elif isinstance(exception, TypeError): | |
| status_code = 500 | |
| message = "Something Went Wrong. Please try again." | |
| error = "SOMETHING_WENT_WRONG" | |
| else: | |
| status_code = 500 | |
| message = "Something Went Wrong. Please try again." | |
| error = "SOMETHING_WENT_WRONG" | |
| return JsonResponse({"message": message, "error": repr(exception)}, status=status_code) | |