error_handler.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. """
  2. 全局错误处理器
  3. 处理应用中的各种异常和错误
  4. """
  5. from flask import jsonify, request, current_app
  6. from app.utils.logger import Logger, ErrorHandler
  7. import traceback
  8. def register_error_handlers(app):
  9. """注册全局错误处理器"""
  10. @app.errorhandler(400)
  11. def bad_request(error):
  12. """处理400错误"""
  13. ErrorHandler.handle_api_error(
  14. error,
  15. request.endpoint if request else None,
  16. request.get_json() if request and request.is_json else None
  17. )
  18. return jsonify({
  19. 'error': 'Bad Request',
  20. 'message': '请求格式错误',
  21. 'status_code': 400
  22. }), 400
  23. @app.errorhandler(401)
  24. def unauthorized(error):
  25. """处理401错误"""
  26. ErrorHandler.handle_api_error(
  27. error,
  28. request.endpoint if request else None,
  29. {'auth_error': True}
  30. )
  31. return jsonify({
  32. 'error': 'Unauthorized',
  33. 'message': '未授权访问',
  34. 'status_code': 401
  35. }), 401
  36. @app.errorhandler(403)
  37. def forbidden(error):
  38. """处理403错误"""
  39. ErrorHandler.handle_api_error(
  40. error,
  41. request.endpoint if request else None,
  42. {'permission_error': True}
  43. )
  44. return jsonify({
  45. 'error': 'Forbidden',
  46. 'message': '禁止访问',
  47. 'status_code': 403
  48. }), 403
  49. @app.errorhandler(404)
  50. def not_found(error):
  51. """处理404错误"""
  52. ErrorHandler.handle_api_error(
  53. error,
  54. request.endpoint if request else None,
  55. {'not_found': True}
  56. )
  57. return jsonify({
  58. 'error': 'Not Found',
  59. 'message': '资源未找到',
  60. 'status_code': 404
  61. }), 404
  62. @app.errorhandler(405)
  63. def method_not_allowed(error):
  64. """处理405错误"""
  65. ErrorHandler.handle_api_error(
  66. error,
  67. request.endpoint if request else None,
  68. {'method': request.method if request else None}
  69. )
  70. return jsonify({
  71. 'error': 'Method Not Allowed',
  72. 'message': '请求方法不允许',
  73. 'status_code': 405
  74. }), 405
  75. @app.errorhandler(422)
  76. def unprocessable_entity(error):
  77. """处理422错误"""
  78. ErrorHandler.handle_api_error(
  79. error,
  80. request.endpoint if request else None,
  81. request.get_json() if request and request.is_json else None
  82. )
  83. return jsonify({
  84. 'error': 'Unprocessable Entity',
  85. 'message': '请求数据无法处理',
  86. 'status_code': 422
  87. }), 422
  88. @app.errorhandler(500)
  89. def internal_server_error(error):
  90. """处理500错误"""
  91. ErrorHandler.handle_exception(
  92. error,
  93. f"内部服务器错误 - {request.endpoint if request else '未知端点'}"
  94. )
  95. return jsonify({
  96. 'error': 'Internal Server Error',
  97. 'message': '服务器内部错误',
  98. 'status_code': 500
  99. }), 500
  100. @app.errorhandler(Exception)
  101. def handle_unexpected_error(error):
  102. """处理未预期的异常"""
  103. ErrorHandler.handle_exception(
  104. error,
  105. f"未预期异常 - {request.endpoint if request else '未知端点'}"
  106. )
  107. # 在开发模式下返回详细错误信息
  108. if current_app.debug:
  109. return jsonify({
  110. 'error': 'Unexpected Error',
  111. 'message': str(error),
  112. 'traceback': traceback.format_exc(),
  113. 'status_code': 500
  114. }), 500
  115. return jsonify({
  116. 'error': 'Unexpected Error',
  117. 'message': '发生未预期的错误',
  118. 'status_code': 500
  119. }), 500
  120. def handle_database_error(error, operation=None):
  121. """处理数据库错误"""
  122. ErrorHandler.handle_database_error(error, operation)
  123. return jsonify({
  124. 'error': 'Database Error',
  125. 'message': '数据库操作失败',
  126. 'status_code': 500
  127. }), 500
  128. def handle_validation_error(error, field=None):
  129. """处理验证错误"""
  130. ErrorHandler.handle_api_error(
  131. error,
  132. request.endpoint if request else None,
  133. {'validation_error': True, 'field': field}
  134. )
  135. return jsonify({
  136. 'error': 'Validation Error',
  137. 'message': f'数据验证失败: {field or "未知字段"}',
  138. 'status_code': 400
  139. }), 400
  140. def handle_authentication_error(error, reason=None):
  141. """处理认证错误"""
  142. ErrorHandler.handle_api_error(
  143. error,
  144. request.endpoint if request else None,
  145. {'auth_error': True, 'reason': reason}
  146. )
  147. return jsonify({
  148. 'error': 'Authentication Error',
  149. 'message': f'认证失败: {reason or "未知原因"}',
  150. 'status_code': 401
  151. }), 401