File size: 2,836 Bytes
fff9e0f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""
统一的错误处理模块
"""

from typing import Optional, Callable, Any
from loguru import logger

class ClinicalError(Exception):
    """临床系统基础异常类"""
    
    def __init__(self, message: str, code: str = "CLINICAL_ERROR", 
                 details: Optional[Dict] = None, original_error: Optional[Exception] = None):
        self.message = message
        self.code = code
        self.details = details or {}
        self.original_error = original_error
        super().__init__(self.message)

class AuthenticationError(ClinicalError):
    """认证错误"""
    def __init__(self, message: str = "认证失败", details: Optional[Dict] = None):
        super().__init__(message, "AUTH_ERROR", details)

class AuthorizationError(ClinicalError):
    """授权错误"""
    def __init__(self, message: str = "权限不足", details: Optional[Dict] = None):
        super().__init__(message, "AUTHZ_ERROR", details)

class ResourceNotFoundError(ClinicalError):
    """资源未找到错误"""
    def __init__(self, resource_type: str, resource_id: str, details: Optional[Dict] = None):
        message = f"{resource_type} {resource_id} 未找到"
        super().__init__(message, "RESOURCE_NOT_FOUND", details)

class ValidationError(ClinicalError):
    """数据验证错误"""
    def __init__(self, field: str, message: str, details: Optional[Dict] = None):
        super().__init__(f"字段 {field} 验证失败: {message}", "VALIDATION_ERROR", details)

def error_handler(func: Callable) -> Callable:
    """统一的错误处理装饰器"""
    def wrapper(*args, **kwargs) -> Any:
        try:
            return func(*args, **kwargs)
        except ClinicalError:
            raise  # 已知错误直接抛出
        except Exception as e:
            logger.error(f"Unexpected error in {func.__name__}: {e}")
            raise ClinicalError(
                "系统内部错误", 
                "INTERNAL_ERROR", 
                {"function": func.__name__},
                e
            )
    return wrapper

def handle_api_errors(response_func: Callable) -> Callable:
    """API错误处理装饰器"""
    def wrapper(*args, **kwargs) -> Dict[str, Any]:
        try:
            return response_func(*args, **kwargs)
        except ClinicalError as e:
            return {
                "success": False,
                "error": {
                    "code": e.code,
                    "message": e.message,
                    "details": e.details
                }
            }
        except Exception as e:
            logger.error(f"API error: {e}")
            return {
                "success": False,
                "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "内部服务器错误"
                }
            }
    return wrapper