1. 共享契约
插件化手册
  • FH2 插件开发手册
    • 产品简介
    • 典型场景
    • 发版说明
    • 快速开始
      • 快速开始总览
      • 第一个插件
      • 后端插件
      • 全栈闭环
    • AI辅助开发
      • AI 开发 Skill
      • 安装与复验
      • 第一个工程
      • 真实需求示例:现场问题上报
      • 改造已有工程
      • 调试与交付
    • 开发指南
      • 开发指南
      • 基础概念
        • 基础概念总览
        • 什么是插件开发
        • 平台架构
        • 前端宿主、扩展点与能力
        • 后端运行时、入口与权限
        • 开发流程
        • 安全与隔离
        • 支持范围与问题反馈
      • 开发指南
        • 开发指南总览
        • 前端插件
          • 前端插件深度指南
          • 前端工程结构
          • 插件清单(fh2-plugin.json)
          • 入口与生命周期
          • 界面与状态
          • 多宿主插件
          • 跨宿主通信服务
          • HTTP、WebSocket 与事件
          • 存储、Blob 与定时器
          • 工具链与本地调试页面
        • 后端插件
          • 后端开发深度指南
          • 后端插件的结构
          • 后端源清单 fh2-plugin.json
          • HTTP 接口处理函数
          • 消息订阅与事件处理函数
          • ctx 与能力注入
          • 数据存储与缓存
          • 流程编排
          • 触发方式
          • 连接外部系统
          • 流程编排练习(DAG)
        • 前后端协作
          • 前后端协作总览
          • 前后端共享契约
          • 端到端幂等
          • 事件、通知与状态
          • 统一错误模型
          • 链路标识与诊断日志
        • 完整练习
          • 环境准备
          • 第一个前端插件
          • 第一个后端插件
          • 第一个全栈插件
      • 能力总览
        • 能力地图
        • 能力可用性矩阵
        • 前端能力
          • 平台通用能力
            • 平台通用能力总览
            • 基础运行时:HTTP、事件、WebSocket 与存储
            • 导航、位置与通知
            • 弹窗、音频与剪贴板
            • 地图能力
            • 项目设备能力
            • WPMZ 与航线预览
            • 受控对象上传
          • 项目宿主
            • 项目宿主总览
            • 项目上下文
            • 项目侧边栏入口
            • 项目插件路由
            • 项目工作区
          • 消息宿主
            • 消息宿主总览
            • 消息告警弹层
            • 消息导航与通知
          • 计划库宿主
            • 计划库宿主总览
            • 计划库表单上下文
            • 计划库表单扩展
            • 校验、提交与 `biz_ext`
          • 驾驶舱
            • 驾驶舱插件能力总览
            • 驾驶舱扩展点
            • 上下文与遥测
            • 相机、检测与 AI
            • 场景几何与直播指针
            • 飞控、云台与任务
            • 驾驶舱平台事件
        • 后端能力
          • 后端能力地图
          • 后端能力总览
          • 配置、受管出网与集成连接
          • 事件与流程
          • 飞行任务与违停巡逻
          • 数据存储
          • 媒体与前端通知
          • 资源租约
          • 作业、目标轨迹与视频处理
      • 调试与测试
        • 调试与测试总览
        • 快速入门排错
        • 本地开发
        • Web IDE:打开工程与保存改动
        • 工作流编辑器:节点、接线与交付
        • 知识与 MCP:先判断需要哪一层事实
        • 前端本地调试
        • 后端运行时与流程调试
        • 模拟数据与测试数据
        • 集成测试与 E2E
        • 日志与链路追踪
        • 常见问题排查
      • 完整示例
        • 示例与案例总览
        • 项目侧边栏与工作区
        • 消息告警卡片
        • 计划表单任务清单
        • 驾驶舱动作与左侧面板
        • 最小后端插件
        • 最小全栈插件
        • 多宿主插件实战
        • 事故快处
        • 交通抓拍
        • 违停巡逻完整案例
      • 构建发布与安全
        • 构建、发布与安全
        • 质量门禁
        • 行业包构建与打包
        • 能力版本发布
        • 安装、升级与回滚
        • 安全基线
      • API参考
        • API 参考总览
        • 前端
          • 前端 API 参考
          • 前端插件清单结构
          • 前端 SDK API
          • 前端扩展点目录
          • 前端能力目录
          • 前端平台事件目录
          • 跨宿主通信服务 API
          • 工具链命令行参考(`fh2-plugin`)
        • 后端
          • 后端 API 参考
          • 后端插件源清单
          • 后端 HTTP 接口参考
          • 后端事件消费参考
          • 后端脚本上下文(`ctx`)
          • 后端数据存储
          • 流程编排语言
          • 流程触发器参考
          • 后端能力目录
          • 后端 HTTP API
        • 共享契约
          • 共享契约参考
          • 类型与契约目录
          • 错误模型
          • 版本兼容性
      • 附录
        • 错误码
        • 术语表
        • 常见问题
  1. 共享契约

错误模型

错误先分类,再决定怎么处理:是调用方改参数就能好(契约错)、是正常业务结果(业务错)、还是等一会儿重试(可重试错)。判断依据是 code,不是 message 文案。
本文按 SDK / 工具链 1.0.0、后端契约 1.1.0 说明失败通道;可重试分类不承诺目标环境自动恢复,也不保证再次调用没有重复副作用。

后端脚本:抛错三分类#

抛错时带上 code,平台按错误码决定处置:
分类错误码平台行为用法
契约错INVALID_ARGUMENT、UNKNOWN_FIELD、UNKNOWN_ENTITY、INVALID_FILTER、EMPTY_FILTER、TYPE_MISMATCH、LIMIT_EXCEEDED、PERMISSION_DENIEDHTTP 400 + 40006;消息丢弃,不重投参数缺失、格式不对、权限不够——调用方改了就能好
业务结果NOT_FOUND、DUPLICATE、CONFLICTHTTP 200 + 20001;不算故障查无此记录、重复提交、状态冲突
可重试TIMEOUT、UNAVAILABLE、DEADLOCK、STORAGE_ERROR,以及其他认不出的错误码、普通 ErrorHTTP 503 + 50301;是否再次请求由调用方决定网络抖动、下游暂不可用
没写 code 的 throw new Error(...) 落入可重试档;认不出的错误码也会在错误文案里点名提示。
各路径的处置差异:
分类HTTP 接口处理函数事件消费流程
契约错400 / 40006丢弃 / 死信步骤失败,不重试
业务结果200 / 20001确认,不重投步骤失败,不重试
可重试503 / 50301;平台不自动重发请求每次投递按部署配置有界尝试,耗尽后丢弃按动作和步骤的有效策略重试
事件最大尝试次数包含首次执行,不是固定“重试 3 次”。丢弃(Discard)只有在队列配置了死信保存时才进入死信队列,恢复后的人工重放也不是自动保证。消费方并发与聚合处置见事件消费参考;流程的尝试次数、退避和整步重跑边界见流程编排语言。
返回值的错误通道不能按入口类推:事件入口顶层失败信封会参与错误分类;HTTP 接口处理函数和流程脚本不会自动提升返回的失败信封。能力返回失败时,先按该方法的信封或异常约定处理,需要让入口失败则显式抛出错误,不能吞掉后显示成功。

后端业务码#

统一信封 {code, message, data},成功判据是 HTTP 2xx 且 code === 0;失败没有 data。完整码表见错误码,常用的:
业务码含义
0成功
40001参数错
40006插件契约错
20001插件业务结果(不是成功)
50301插件暂不可用(可重试)
40101未授权
40301流程未声明 api 触发器
40401 / 40402流程不存在 / 流程实例不存在
40002–40005、40901–40903信号校验失败
50001工作流引擎调用失败
50401信号投递超时(结果未知)

前端异常(PluginError)#

跨隔离环境传回来的错误长这样。用 error.code 或 isPluginError(error) 判断,不要依赖 instanceof(跨边界不可靠):
interface PluginErrorShape {
  code: string
  message: string
  pluginId?: string
  hostId?: string
  detail?: PluginValue
}
常用错误码(完整列表见 SDK 导出的 PLUGIN_ERROR_CODES 常量):
错误码场景处理
MANIFEST_INVALID / PLUGIN_ENTRY_INVALID清单或入口不合法修正后重新构建
CAPABILITY_NOT_AVAILABLE能力未授权或宿主未提供降级,不要当网络错误重试
PLUGIN_GATEWAY_ERROR网关返回业务错误捕获异常并核对其结构化详情中的业务码,不把失败当普通成功返回值
PLUGIN_NETWORK_BLOCKEDctx.apiCall() 的 endpoint、method、GET 请求体、超时或幂等键不合法修正调用参数;它不是入口原生 fetch / XHR / WebSocket 护栏拦截的稳定错误码
VIEW_NOT_DECLARED / VIEW_LOAD_FAILED界面未声明 / 加载失败补清单 views / 检查构建产物
PLUGIN_VALUE_INVALID跨边界传了不可克隆的值只传 PluginValue
STORAGE_QUOTA_EXCEEDED存储超配额清理数据,重试无效
TIMEOUT请求超时结果未知:先查状态,再用同一幂等键决定重试
HOST_RUNTIME_DISPOSED / RUNTIME_UNRESPONSIVE运行时已停用 / 无响应停止使用旧上下文和句柄
前端错误码只增不改;删除或改义属于破坏性协议变更。

超时与「结果未知」#

前端 TIMEOUT:请求可能已送达。先按业务 ID 查权威状态,再决定是否用同一幂等键重试。
后端 50401:信号投递在超时内没返回。用相同 Idempotency-Key 重试,或先查 awaitingSignal。
accepted(受理)不等于设备执行成功;最终结果以任务、设备或业务记录的权威状态为准。

日志规则#

错误 message 会进浏览器诊断、服务日志和流程历史。只写错误码、字段名、插件/脚本/流程 ID 和固定文案;不要写 token、请求体、SQL、签名 URL 或配置值。

常见问题#

现象原因与处理
相同错误反复出现核对错误分类、实际尝试次数及事件是否重新投递;不要仅凭重复日志推断无限重试
返回 200 但业务是失败的20001 是业务结果不是成功;判成功只能看 code === 0
超时后重试造成重复写入重试没带幂等键;补 Idempotency-Key,服务端用 stableId 去重
instanceof PluginError 判断失效跨隔离环境不可靠;改用 error.code 或 isPluginError()
修改于 2026-10-22 03:40:06
上一页
类型与契约目录
下一页
版本兼容性
Built with