""" 全局错误处理器 处理应用中的各种异常和错误 """ 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