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

推荐订阅源

The Hacker News
The Hacker News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
Recent Announcements
Recent Announcements
D
DataBreaches.Net
P
Proofpoint News Feed
V
Visual Studio Blog
J
Java Code Geeks
Recorded Future
Recorded Future
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Full Disclosure
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
罗磊的独立博客
Jina AI
Jina AI
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
G
GRAHAM CLULEY
Y
Y Combinator Blog
L
LangChain Blog
L
LINUX DO - 热门话题
宝玉的分享
宝玉的分享
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Help Net Security
云风的 BLOG
云风的 BLOG
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园_首页
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Latest news
Latest news
T
Threatpost
T
Tenable Blog
有赞技术团队
有赞技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Stack Overflow Blog
Stack Overflow Blog
C
Cisco Blogs
C
Check Point Blog
T
Tor Project blog
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
美团技术团队
I
Intezer
S
Securelist
AWS News Blog
AWS News Blog

博客园 - 我才是银古

第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-21 · via 博客园 - 我才是银古

第六章:条件执行、重试与错误策略

GeoPipeAgent 提供了强大的流程控制能力,包括条件执行(when)、自动重试(retry)和错误跳过(skip)。本章详细介绍这些机制的工作原理和最佳实践。


6.1 错误策略:on_error

on_error 字段控制步骤失败时的行为,可取三个值:fail(默认)、skipretry

6.1.1 on_error: fail(默认)

步骤失败时立即终止整个流水线,抛出 StepExecutionError。JSON 报告的 status"error"

- id: critical-step
  use: vector.clip
  params:
    input: "$load-data"
    clip: "$load-boundary"
  on_error: fail    # 裁剪失败则终止,不产生错误数据

适用场景:关键处理步骤,失败后继续执行会产生无意义的结果。

6.1.2 on_error: skip

步骤失败时跳过该步骤,步骤状态标记为 "skipped",输出设为空 StepResult(),流水线继续执行后续步骤。

- id: optional-simplify
  use: vector.simplify
  params:
    input: "$load-data"
    tolerance: 0.001
    preserve_topology: true
  on_error: skip    # 简化失败时跳过,使用原始几何继续

注意:跳过步骤后,其输出为空 StepResult()。后续步骤若引用该步骤,需通过 when 条件判断,避免将空值传给下一个步骤。

适用场景

  • 可选的优化步骤(简化、平滑等)
  • 某些数据可能不需要的处理步骤
  • 非关键的输出步骤(如保存中间结果)

6.1.3 on_error: retry

步骤失败时自动重试,最多 3 次,每次重试前等待递增时间(0.5s、1s、1.5s)。若 3 次都失败,抛出 StepExecutionError

- id: geocode-address
  use: network.geocode
  params:
    address: "北京市海淀区清华大学"
  on_error: retry   # 网络请求超时时自动重试

重试日志示例:

WARNING: Step 'geocode-address' attempt 1/3 failed: Connection timeout — retrying...
WARNING: Step 'geocode-address' attempt 2/3 failed: Connection timeout — retrying...
INFO: Step 'geocode-address' (network.geocode) completed in 2.341s

适用场景

  • 网络请求步骤(地理编码、API 调用)
  • 可能因资源争用而偶发失败的步骤
  • 外部服务不稳定时的容错处理

6.2 条件执行:when

when 字段接受一个条件表达式字符串。当表达式求值为 True 时,步骤正常执行;为 False 时,步骤状态标记为 "skipped"

6.2.1 基本语法

- id: fix-geometry
  use: qc.geometry_validity
  params:
    input: "$load-data"
    auto_fix: true
  when: "$check-geometry.issues_count > 0"

6.2.2 支持的表达式

when 表达式通过 safe_eval.py 中的 AST 白名单安全求值,支持以下语法:

比较运算符

when: "$step.issues_count > 0"
when: "$step.feature_count >= 100"
when: "$step.issues_count == 0"
when: "$step.crs != 'EPSG:4326'"

逻辑运算符

when: "$check.issues_count > 0 and ${auto_fix} == true"
when: "$check.issues_count > 0 or ${force_fix} == true"
when: "not ${skip_qc}"

真值检查(步骤输出非空):

when: "${enable_analysis}"     # 变量为 true 时执行
when: "${enable_analysis} == true"  # 等价写法

6.2.3 引用变量和步骤属性

when 中同样支持 ${var}$step.attr

pipeline:
  variables:
    enable_qc: true
    min_features: 10

  steps:
    - id: load-data
      use: io.read_vector
      params: { path: "data.shp" }

    # 基于变量的条件
    - id: check-geometry
      use: qc.geometry_validity
      params: { input: "$load-data" }
      when: "${enable_qc} == true"

    # 基于步骤 stats 的条件
    - id: report-small-dataset
      use: io.write_vector
      params:
        input: "$load-data"
        path: "warnings/small_dataset.geojson"
      when: "$load-data.feature_count < ${min_features}"

6.2.4 when 求值失败时的行为

when 表达式因解析错误或引用不存在的属性而无法求值,框架记录警告日志并将结果视为 False(步骤跳过):

WARNING: Cannot evaluate when='$check.nonexistent > 0' (resolved='None > 0'), treating as False

这种"安全失败"策略避免了因条件表达式错误而中断流水线。


6.3 错误报告结构

当步骤失败时,JSON 报告会包含详细的错误信息:

{
  "error": "StepExecutionError",
  "step_id": "buffer-roads",
  "message": "CRS mismatch: input uses geographic CRS (EPSG:4326), but distance in meters requires a projected CRS.",
  "suggestion": "Add a vector.reproject step before this step to convert to a projected CRS.",
  "cause": "Operation `buffer` is not supported for geographic coordinates..."
}

框架内置了智能错误建议(_suggest_fix 函数),针对常见错误自动提供修复建议:

错误模式 自动建议
CRS 不匹配 / 地理坐标缓冲 在此步骤前添加 vector.reproject 转换为投影坐标系
CRS 为 None 设置 CRS 或确保源文件有 CRS 元数据
文件未找到 检查输入文件路径
权限错误 检查输入/输出路径的文件权限
不支持的格式 检查文件格式,支持 GeoJSON、Shapefile、GPKG
无效几何 在此步骤前添加 qc.geometry_validity 步骤
空几何 vector.query 过滤掉空几何要素
字段不存在 检查字段名是否正确,用 io.read_vector stats 查看可用字段

6.4 综合实战:QC 驱动的条件修复流水线

下面是一个综合运用 whenon_error: skipon_error: retry 的完整示例:

pipeline:
  name: "数据入库前质检与修复"
  description: "对输入矢量数据进行质检,有问题则自动修复,最终校验并入库"

  variables:
    input_path: "data/buildings.shp"
    output_path: "output/buildings_clean.geojson"
    auto_fix: true

  steps:
    # 步骤1:读取数据
    - id: load-data
      use: io.read_vector
      params:
        path: "${input_path}"

    # 步骤2:坐标系检查(失败时跳过,不中断流程)
    - id: check-crs
      use: qc.crs_check
      params:
        input: "$load-data"
        expected_crs: "EPSG:4326"
      on_error: skip

    # 步骤3:几何有效性检查
    - id: check-geometry
      use: qc.geometry_validity
      params:
        input: "$load-data"
        auto_fix: false
        severity: "error"

    # 步骤4:仅在有几何问题时执行修复
    - id: fix-geometry
      use: qc.geometry_validity
      params:
        input: "$load-data"
        auto_fix: true
      when: "$check-geometry.issues_count > 0"
      on_error: skip     # 修复失败时跳过,用原始数据继续

    # 步骤5:拓扑检查(失败时跳过)
    - id: check-topology
      use: qc.topology
      params:
        input: "$load-data"
        rules: ["no_overlaps", "no_gaps"]
      on_error: skip

    # 步骤6:属性完整性检查(失败时跳过)
    - id: check-attrs
      use: qc.attribute_completeness
      params:
        input: "$load-data"
        required_fields: ["name", "height", "type"]
        severity: "warning"
      on_error: skip

    # 步骤7:保存质检问题报告(仅有问题时)
    - id: save-issue-report
      use: io.write_vector
      params:
        input: "$check-geometry.issues_gdf"
        path: "output/geometry_issues.geojson"
        format: "GeoJSON"
      when: "$check-geometry.issues_count > 0"
      on_error: skip

    # 步骤8:保存最终结果(优先使用修复后数据)
    - id: save-result
      use: io.write_vector
      params:
        input: "$fix-geometry"     # fix-geometry 若被跳过则为空,改用 load-data
        path: "${output_path}"
        format: "GeoJSON"

    # 步骤9:地理编码示例(网络失败时重试)
    - id: geocode-center
      use: network.geocode
      params:
        address: "北京市中心"
      on_error: retry

  outputs:
    result: "$save-result"
    geometry_issues: "$check-geometry.issues_count"
    topology_issues: "$check-topology.issues_count"
    attr_issues: "$check-attrs.issues_count"

6.5 whenon_error 的协同使用

whenon_error 是两个独立的机制,可以组合使用:

# 场景:可选的优化步骤,仅在开启优化选项时执行,执行失败时跳过
- id: optimize-topology
  use: vector.dissolve
  params:
    input: "$load-data"
    by: "type"
  when: "${enable_optimize} == true"   # 满足条件才尝试执行
  on_error: skip                       # 执行失败时跳过

执行逻辑

  1. whenFalse → 步骤状态 skipped,不执行(也不会触发 on_error
  2. whenTrue → 执行步骤:
    • 成功 → 状态 success
    • 失败 + on_error: skip → 状态 skipped,继续
    • 失败 + on_error: retry → 重试 3 次,仍失败则终止
    • 失败 + on_error: fail → 终止流水线

6.6 步骤被跳过后的引用处理

当步骤被跳过(status: skipped)时,其输出为空 StepResult(),即 output=Nonestats={}。后续引用该步骤时需注意:

steps:
  - id: optional-fix
    use: qc.geometry_validity
    params: { input: "$load-data", auto_fix: true }
    when: "${apply_fix} == true"   # 可能被跳过

  # 危险:如果 optional-fix 被跳过,$optional-fix 为 None
  - id: buffer
    use: vector.buffer
    params:
      input: "$optional-fix"       # ⚠️ 若 optional-fix 被跳过,此处传入 None 会失败
      distance: 100

推荐处理模式:使用两个步骤,分别对应修复后数据和原始数据:

  # 使用修复后数据(若修复步骤被跳过则该分支也跳过)
  - id: buffer-fixed
    use: vector.buffer
    params:
      input: "$optional-fix"
      distance: 100
    when: "${apply_fix} == true"

  # 使用原始数据(当不需要修复时)
  - id: buffer-original
    use: vector.buffer
    params:
      input: "$load-data"
      distance: 100
    when: "${apply_fix} != true"

6.7 本章小结

本章全面介绍了 GeoPipeAgent 的流程控制机制:

  1. on_error: fail(默认):关键步骤失败时终止流水线
  2. on_error: skip:可选步骤失败时跳过,继续执行
  3. on_error: retry:网络/外部服务步骤失败时自动重试(最多 3 次)
  4. when 条件:基于前置步骤输出或变量值,有选择地执行步骤
  5. 错误建议:框架内置智能错误建议,帮助快速定位和修复问题
  6. 协同使用whenon_error 组合使用,构建健壮的自适应流水线

下一章将深入介绍 IO 步骤的使用方法,覆盖矢量和栅格数据的读写。


导航← 第五章:变量与步骤引用第七章:IO 步骤详解 →