惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
N
News and Events Feed by Topic
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Secure Thoughts
G
GRAHAM CLULEY
Google Online Security Blog
Google Online Security Blog
Help Net Security
Help Net Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
O
OpenAI News
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 最新话题
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
H
Hacker News: Front Page
W
WeLiveSecurity
P
Privacy International News Feed
Forbes - Security
Forbes - Security
月光博客
月光博客
PCI Perspectives
PCI Perspectives
T
Tailwind CSS Blog
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
Engineering at Meta
Engineering at Meta
F
Full Disclosure
AI
AI
Hacker News - Newest:
Hacker News - Newest: "LLM"
Schneier on Security
Schneier on Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Visual Studio Blog
The Hacker News
The Hacker News
博客园 - 叶小钗
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第十五章:数据模型与错误体系
我才是银古 · 2026-06-22 · via 博客园 - 我才是银古

第十五章:数据模型与错误体系

本章系统介绍 GeoPipeAgent 的数据模型(models/)和错误体系(errors.py),这是理解框架内部机制和编写可靠代码的基础。


15.1 核心数据模型

GeoPipeAgent 使用 Python dataclass 定义数据模型,位于 src/geopipe_agent/models/ 目录。

15.1.1 PipelineDefinition

描述一个已解析的流水线,是 YAML 文件在内存中的完整表示。

@dataclass
class PipelineDefinition:
    name: str                          # 流水线名称(必填)
    steps: list[StepDefinition]        # 步骤列表
    description: str = ""              # 流水线描述
    crs: str | None = None             # 全局默认 CRS
    variables: dict = {}               # 变量字典
    outputs: dict = {}                 # 输出声明

何时使用:通过 parse_yaml() 获得;运行时通过修改 variables 覆盖变量值。

15.1.2 StepDefinition

描述流水线中的一个步骤。

@dataclass
class StepDefinition:
    id: str                    # 步骤唯一 ID
    use: str                   # 步骤注册 ID(如 "vector.buffer")
    params: dict = {}          # 步骤参数(含变量/引用占位符)
    when: str | None = None    # 条件执行表达式
    on_error: str = "fail"     # 错误策略:"fail" | "skip" | "retry"
    backend: str | None = None # 指定后端

注意params 中的值在执行时才会解析,此时仍可能含有 ${var}$step-id 占位符。

15.1.3 StepResult

步骤执行结果,是步骤间数据传递的核心载体。

@dataclass
class StepResult:
    output: Any = None              # 主输出(GeoDataFrame、str、raster_info 等)
    stats: dict = {}                # 统计信息(feature_count、crs 等)
    metadata: dict = {}             # 元数据(issues_gdf、transform 等)
    issues: list[QcIssue] = []      # QC 问题列表(仅 QC 步骤填充)

__getattr__ 机制StepResult 实现了 __getattr__,允许通过属性语法访问 statsmetadata 中的键:

result.feature_count    # → result.stats["feature_count"]
result.issues_gdf       # → result.metadata["issues_gdf"]
result.crs              # → result.stats["crs"] 或 result.metadata["crs"]

这个机制使得 $step.feature_count 等引用语法成为可能。

summary() 方法:为 JSON 报告生成可序列化的摘要:

def summary(self) -> dict:
    summary = {}
    if self.output is not None:
        summary["feature_count"] = len(self.output)
        summary["crs"] = str(self.output.crs)
        summary["geometry_types"] = list(self.output.geometry.geom_type.unique())
    summary.update(self.stats)
    if self.issues:
        summary["issues_count"] = len(self.issues)
        summary["issues_by_severity"] = Counter(i.severity for i in self.issues)
    return summary

15.1.4 QcIssue

描述一个数据质量问题,由 QC 步骤生成。

@dataclass
class QcIssue:
    rule_id: str               # 规则 ID(如 "geometry_validity")
    severity: str              # 级别:"error" | "warning" | "info"
    feature_index: int | None  # 问题要素的 GeoDataFrame 行索引
    message: str               # 人类可读的问题描述
    geometry: Any              # 问题位置几何(可选,用于可视化)
    details: dict              # 规则特定详情

    def to_dict(self) -> dict: # JSON 可序列化字典

QcIssue 列表存储在 StepResult.issues 中,同时通过 metadata["issues_gdf"] 提供 GeoDataFrame 视图。


15.2 错误体系

GeoPipeAgent 定义了一个层次化的错误体系,所有异常都继承自 GeopipeAgentError

GeopipeAgentError(基类)
├── PipelineParseError        # YAML 解析失败
├── PipelineValidationError   # 校验失败(ID 格式、引用不存在等)
├── StepExecutionError        # 步骤执行失败(含 step_id、建议、原因)
├── BackendNotAvailableError  # 后端不可用
├── StepNotFoundError         # 步骤 ID 未注册
└── VariableResolutionError   # 变量或引用解析失败

15.2.1 各错误类详解

PipelineParseError

# 触发条件
parse_yaml("""
name: "no pipeline key"  # 缺少顶层 pipeline:
steps: []
""")
# 错误: PipelineParseError("Missing 'pipeline' key at the top level.")

PipelineValidationError

# 触发条件
validate_pipeline(pipeline)
# 步骤 ID 不合法、引用不存在的步骤、使用未注册的步骤类型等
# 错误: PipelineValidationError("Step id 'my.step' is invalid. step_id must match [a-z0-9_-]")

StepExecutionError(最重要):

@dataclass
class StepExecutionError(GeopipeAgentError):
    step_id: str        # 失败的步骤 ID
    suggestion: str     # AI 友好的修复建议(可能为 None)
    cause: Exception    # 原始异常

    def to_dict(self) -> dict:
        return {
            "error": "StepExecutionError",
            "step_id": self.step_id,
            "message": str(self),
            "suggestion": self.suggestion,
            "cause": str(self.cause)
        }

JSON 报告中的错误示例

{
  "error": "StepExecutionError",
  "step_id": "buffer-roads",
  "message": "Geometry must be a Point or LineString geometry type if operations are in degrees.",
  "suggestion": "Add a vector.reproject step before this step to convert to a projected CRS.",
  "cause": "Geometry must be a Point or ..."
}

VariableResolutionError

# 触发条件:引用不存在的步骤或变量
# ${undefined_var} 在执行时(非校验时)
# $nonexistent-step 在执行时(如果校验被绕过)

15.3 错误处理最佳实践

在 Python 代码中捕获错误

from geopipe_agent.errors import (
    GeopipeAgentError,
    PipelineParseError,
    PipelineValidationError,
    StepExecutionError,
    VariableResolutionError,
)

try:
    pipeline = parse_yaml("pipeline.yaml")
    warnings = validate_pipeline(pipeline)
    report = execute_pipeline(pipeline)
except PipelineParseError as e:
    print(f"YAML 格式错误: {e}")
except PipelineValidationError as e:
    print(f"流水线校验失败: {e}")
except StepExecutionError as e:
    print(f"步骤 '{e.step_id}' 执行失败: {e}")
    if e.suggestion:
        print(f"建议: {e.suggestion}")
except GeopipeAgentError as e:
    print(f"框架错误: {e}")

错误类型判断流程

运行时报错
├── 格式错误(如缺少 pipeline:)
│   → PipelineParseError → 检查 YAML 格式
├── 校验错误(如步骤 ID 含点号)
│   → PipelineValidationError → 检查步骤定义
├── 步骤执行错误(如文件不存在)
│   → StepExecutionError → 查看 suggestion 字段
│   → step_id 指示哪个步骤失败
└── 变量解析错误(如引用未定义变量)
    → VariableResolutionError → 检查 variables 和引用拼写

15.4 StepInfo:步骤注册信息

StepInfo 是步骤注册表中的元数据对象,由 @step 装饰器创建:

@dataclass
class StepInfo:
    id: str                     # 注册 ID(如 "vector.buffer")
    func: Callable              # 步骤函数
    name: str                   # 显示名称
    description: str            # 步骤描述
    category: str               # 类别(io/vector/raster/analysis/network/qc)
    params: dict                # 参数规范(含 type/required/default/description)
    outputs: dict               # 输出规范
    backends: list[str]         # 支持的后端列表
    examples: list[dict]        # 示例(用于 Skill 文档生成)

    def to_dict(self) -> dict   # 序列化(用于 describe 命令和 Skill 生成)

查询步骤信息

# 查看步骤详情
geopipe-agent describe vector.buffer

# 输出(JSON 格式)
{
  "id": "vector.buffer",
  "name": "矢量缓冲区分析",
  "description": "对输入的矢量数据生成指定距离的缓冲区",
  "category": "vector",
  "params": {
    "input": {"type": "geodataframe", "required": true, "description": "输入矢量数据"},
    "distance": {"type": "number", "required": true, "description": "缓冲区距离"},
    "cap_style": {"type": "string", "required": false, "default": "round", ...}
  },
  "outputs": {
    "output": {"type": "geodataframe"},
    "stats": {"type": "dict"}
  },
  "backends": ["native_python", "qgis_process"]
}

15.5 本章小结

本章系统介绍了 GeoPipeAgent 的数据模型和错误体系:

  1. PipelineDefinition / StepDefinition:内存中的流水线表示
  2. StepResult:步骤间数据传递的核心,__getattr__ 机制支持点语法访问 stats/metadata
  3. QcIssue:质检问题记录,含规则 ID、严重级别、要素索引、描述和几何
  4. 错误层次GeopipeAgentError 基类 → 5 个子类,各有特定触发场景
  5. StepExecutionError:含 step_idsuggestion 字段,AI 友好

导航← 第十四章:多后端系统第十六章:CLI 命令行工具 →