59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""项目级异常定义
|
|
|
|
异常层次:
|
|
ReimbursementError — 所有业务异常的基类
|
|
├── ExtractionError — 文档提取失败(单个文件/批量全失败)
|
|
├── BrowserError — 浏览器自动化失败
|
|
└── ValidationError — 校验失败(规则校验/语义校验)
|
|
|
|
使用规则:
|
|
- 模块内部: 捕获具体异常 → 记录日志 → 截图(如适用) → re-raise
|
|
- 模块边界: 不吞异常,向上传播
|
|
- 顶层 (routes.py / orchestrator.py): 统一捕获 ReimbursementError
|
|
- 可恢复场景: 返回结构化结果而非 raise
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
class ReimbursementError(Exception):
|
|
"""业务异常基类"""
|
|
|
|
def __init__(self, message: str, details: dict[str, Any] | None = None) -> None:
|
|
super().__init__(message)
|
|
self.details = details or {}
|
|
|
|
|
|
class ExtractionError(ReimbursementError):
|
|
"""文档提取失败"""
|
|
|
|
def __init__(
|
|
self,
|
|
message: str,
|
|
failed_files: list[str] | None = None,
|
|
details: dict[str, Any] | None = None,
|
|
) -> None:
|
|
super().__init__(message, details)
|
|
self.failed_files = failed_files or []
|
|
|
|
|
|
class BrowserError(ReimbursementError):
|
|
"""浏览器自动化操作失败"""
|
|
|
|
pass
|
|
|
|
|
|
class ValidationError(ReimbursementError):
|
|
"""校验失败"""
|
|
|
|
def __init__(
|
|
self,
|
|
message: str,
|
|
missing_fields: list[str] | None = None,
|
|
details: dict[str, Any] | None = None,
|
|
) -> None:
|
|
super().__init__(message, details)
|
|
self.missing_fields = missing_fields or []
|