| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- """
- 全局错误处理器
- 处理应用中的各种异常和错误
- """
- from flask import jsonify, request, current_app
- from app.utils.logger import Logger, ErrorHandler
- import traceback
- def register_error_handlers(app):
- """注册全局错误处理器"""
-
- @app.errorhandler(400)
- def bad_request(error):
- """处理400错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- request.get_json() if request and request.is_json else None
- )
-
- return jsonify({
- 'error': 'Bad Request',
- 'message': '请求格式错误',
- 'status_code': 400
- }), 400
-
- @app.errorhandler(401)
- def unauthorized(error):
- """处理401错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- {'auth_error': True}
- )
-
- return jsonify({
- 'error': 'Unauthorized',
- 'message': '未授权访问',
- 'status_code': 401
- }), 401
-
- @app.errorhandler(403)
- def forbidden(error):
- """处理403错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- {'permission_error': True}
- )
-
- return jsonify({
- 'error': 'Forbidden',
- 'message': '禁止访问',
- 'status_code': 403
- }), 403
-
- @app.errorhandler(404)
- def not_found(error):
- """处理404错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- {'not_found': True}
- )
-
- return jsonify({
- 'error': 'Not Found',
- 'message': '资源未找到',
- 'status_code': 404
- }), 404
-
- @app.errorhandler(405)
- def method_not_allowed(error):
- """处理405错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- {'method': request.method if request else None}
- )
-
- return jsonify({
- 'error': 'Method Not Allowed',
- 'message': '请求方法不允许',
- 'status_code': 405
- }), 405
-
- @app.errorhandler(422)
- def unprocessable_entity(error):
- """处理422错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- request.get_json() if request and request.is_json else None
- )
-
- return jsonify({
- 'error': 'Unprocessable Entity',
- 'message': '请求数据无法处理',
- 'status_code': 422
- }), 422
-
- @app.errorhandler(500)
- def internal_server_error(error):
- """处理500错误"""
- ErrorHandler.handle_exception(
- error,
- f"内部服务器错误 - {request.endpoint if request else '未知端点'}"
- )
-
- return jsonify({
- 'error': 'Internal Server Error',
- 'message': '服务器内部错误',
- 'status_code': 500
- }), 500
-
- @app.errorhandler(Exception)
- def handle_unexpected_error(error):
- """处理未预期的异常"""
- ErrorHandler.handle_exception(
- error,
- f"未预期异常 - {request.endpoint if request else '未知端点'}"
- )
-
- # 在开发模式下返回详细错误信息
- if current_app.debug:
- return jsonify({
- 'error': 'Unexpected Error',
- 'message': str(error),
- 'traceback': traceback.format_exc(),
- 'status_code': 500
- }), 500
-
- return jsonify({
- 'error': 'Unexpected Error',
- 'message': '发生未预期的错误',
- 'status_code': 500
- }), 500
- def handle_database_error(error, operation=None):
- """处理数据库错误"""
- ErrorHandler.handle_database_error(error, operation)
-
- return jsonify({
- 'error': 'Database Error',
- 'message': '数据库操作失败',
- 'status_code': 500
- }), 500
- def handle_validation_error(error, field=None):
- """处理验证错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- {'validation_error': True, 'field': field}
- )
-
- return jsonify({
- 'error': 'Validation Error',
- 'message': f'数据验证失败: {field or "未知字段"}',
- 'status_code': 400
- }), 400
- def handle_authentication_error(error, reason=None):
- """处理认证错误"""
- ErrorHandler.handle_api_error(
- error,
- request.endpoint if request else None,
- {'auth_error': True, 'reason': reason}
- )
-
- return jsonify({
- 'error': 'Authentication Error',
- 'message': f'认证失败: {reason or "未知原因"}',
- 'status_code': 401
- }), 401
|