errors.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import traceback
  2. from flask import jsonify, current_app, request
  3. from sqlalchemy.exc import SQLAlchemyError
  4. from werkzeug.exceptions import HTTPException
  5. def register_error_handlers(app):
  6. @app.errorhandler(Exception)
  7. def handle_error(error):
  8. # 获取详细的堆栈追踪信息
  9. stack_trace = traceback.format_exc()
  10. # 获取请求的相关信息
  11. request_method = request.method
  12. request_url = request.url
  13. request_data = request.get_data(as_text=True)
  14. # 记录日志,帮助排查问题
  15. current_app.logger.error(f"Error: {str(error)}\nStack Trace: {stack_trace}\n"
  16. f"Request Method: {request_method}\n"
  17. f"Request URL: {request_url}\n"
  18. f"Request Data: {request_data}")
  19. # 如果是数据库相关的错误
  20. if isinstance(error, SQLAlchemyError):
  21. return jsonify({"error": "Database operation failed"}), 500
  22. # 如果是 HTTP 异常(如 404, 405 等)
  23. elif isinstance(error, HTTPException):
  24. return jsonify({"error": error.description}), error.code
  25. # 其他标准异常(例如 ValueError, KeyError 等)
  26. elif isinstance(error, ValueError):
  27. return jsonify({"error": "Invalid value provided"}), 400
  28. elif isinstance(error, KeyError):
  29. return jsonify({"error": "Missing key in the request"}), 400
  30. # 捕获所有其他错误
  31. return jsonify({"error": "An unexpected error occurred"}), 500