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. 附录

错误码

按端分三块:前端运行时错误码(SDK 常量)、后端 HTTP 业务码、后端脚本抛错分类。判断一律看 code,不要解析 message 文案。

前端异常(PluginError)#

跨隔离环境传回的错误形状;用 error.code 或 isPluginError(error) 判断,不要依赖 instanceof:
import type { PluginErrorCode, PluginValue } from 'fh2-plugin-sdk'

interface PluginErrorShape {
  readonly code: PluginErrorCode
  readonly message: string
  readonly pluginId?: string
  readonly hostId?: string
  readonly detail?: PluginValue
}
常用错误码:
错误码发生位置调用方动作
MANIFEST_INVALID、ENGINE_INCOMPATIBLE、PLUGIN_ENTRY_INVALID安装 / 激活修正清单、入口或运行环境后重新构建
EXTENSION_POINT_NOT_FOUND、EXTENSION_DECLARATION_INVALID、EXTENSION_IMPLEMENTATION_INVALID扩展声明或贡献对照扩展点 ID、清单静态字段与 contribute() 的状态/方法
REGISTRATION_CONFLICT、POINT_CONSUMER_CONFLICT重复注册保证插件内 ID、界面处理函数、跨宿主通信服务提供方唯一
CAPABILITY_NOT_AVAILABLE、CAPABILITY_CONTRACT_INVALID、CAPABILITY_REALM_MISMATCH能力获取get() 为 undefined 时降级;环境限制不能靠重试绕过
SERVICE_CONTRACT_INVALID、SERVICE_UNAVAILABLE跨宿主通信服务修正 PluginValue 契约;提供方未注册时等待或降级
VIEW_NOT_DECLARED、VIEW_LOAD_FAILED、VIEW_CONTRIBUTION_ALREADY_MOUNTED界面在清单 views 声明资源;检查默认导出与挂载生命周期
HOST_RUNTIME_DISPOSED、RUNTIME_UNRESPONSIVE、RESOURCE_LEAK生命周期停止使用旧上下文、句柄、定时器和订阅
PLUGIN_VALUE_INVALID、CONFIG_VALUE_INVALID跨边界传值 / 配置只传可克隆的 PluginValue;非法配置会回退默认值
STORAGE_QUOTA_EXCEEDED键值 / Blob 存储删除不再使用的数据;重试无法突破配额
PLUGIN_NETWORK_BLOCKEDctx.apiCall() 参数校验核对 endpoint、method、GET 请求体、超时及幂等键;业务路径用单 /,绝对 HTTP(S) URL 另需白名单。它不是裸网络 Guard 拦截的稳定错误码
PLUGIN_GATEWAY_ERROR受管请求的网关响应检查 detail.gatewayCode、gatewayMessage 与 HTTP 状态,不把业务失败当成功
TIMEOUT请求或异步操作副作用可能已送达;先按业务 ID 查状态,再用同一幂等键决定重试
完整错误码列表见 SDK 1.0.0 导出的 PLUGIN_ERROR_CODES 常量。错误码只增不改;删除或改义属于破坏性协议变更。

后端 HTTP 业务码#

已部署后端服务的接口返回 {code, message, data?}。成功判据:HTTP 2xx 且 code === 0;该服务的失败响应没有 data。下表描述该服务,不是本地模拟器或所有网关的 HTTP 状态表;直接后端服务的访问凭据与插件网关 Token 不可互换。
前端经 ctx.apiCall('/plugin/invoke', ...) 调用时,非零数字业务码会抛 PLUGIN_GATEWAY_ERROR;数字码在 error.detail.gatewayCode,消息在 gatewayMessage,HTTP 状态在 httpStatus。不要把 PluginError.code 当成后端业务码,也不要在普通返回值上处理失败。
HTTP业务码含义调用方动作
2000成功读 data
20020001插件业务结果(如 NOT_FOUND)不是成功;按业务处理,不要盲目重试
40040001JSON / 参数或业务 ID 非法修改请求
40040002未声明的流程信号用流程 await/callback 声明的信号名
40040003信号数据缺必填键补齐 provides 声明的键
40040004信号数据类型错误按声明修正类型
40040005信号数据含未声明键移除字段,或流程显式设 extraKeys: "allow"
40040006插件契约错修正 {pluginId, handler, input} 或脚本入参
40140101未授权(token 缺失或错误)重新取得凭据;不要记录 token 值
40340301流程未声明 api 触发器改用允许的触发方式
40440401流程不存在核对流程名或路径
40440402流程实例不存在核对完整实例 ID
40540501HTTP 方法错误按响应 Allow 头改用正确方法
40940901当前未等待该信号查询 awaitingSignal 后再投递
40940902中断信号不在当前作用域等流程进入声明的中断范围
40940903同一信号重复投递视为已受理,查询流程状态
50050001工作流引擎调用失败按监控与幂等性决定重试
50350301插件暂不可用(可重试)带稳定 Idempotency-Key 退避重试
50450401信号投递超时结果未知;用相同幂等键重试或先查实例状态

本地 HTTP 错误#

Toolchain 1.0.0 当前 dev 的后端调用与事件辅助接口也返回数字错误信封:{code, message, data: null}。数字码按脚本错误分类映射,原错误标识保留在 message,但 HTTP 状态保留本地行为,不改成上表的部署服务状态。
本地错误或请求HTTP数字 code
INVALID_ARGUMENT,或 stableId 缺键的 IDEMPOTENCY_KEY_REQUIRED40040006
PERMISSION_DENIED40340006
PLUGIN_NOT_FOUND / HANDLER_NOT_FOUND / EVENT_HANDLER_NOT_FOUND40440006
NOT_FOUND40420001
CONFLICT;DUPLICATE409;40020001
未分类字符串错误(如 BRIDGE_FAILED);普通脚本异常400;50050301
RUNTIME_CLOSED / BACKEND_DIST_MISSING50350301
invoke 缺少有效插件 Token40110005
BRIDGE_FAILED 即使 HTTP 为 400 也属于未分类的可重试错误,不是契约错;HTTP 400 不能单独决定业务分类。invoke 多余顶层字段当前仍可能被接受,不能据此证明部署服务的 40001 校验。更多差异见后端调试的已知限制。

后端脚本抛错:三分类#

脚本里主动抛错时带上字符串 code,平台按错误码三分类处置;这与 HTTP 信封的数字 code 是两层。下表 HTTP 映射适用于已部署后端服务,本地 HTTP 状态见上一节:
分类错误码示例HTTP 映射流程 / 事件处置
契约错INVALID_ARGUMENT、UNKNOWN_FIELD、UNKNOWN_ENTITY、INVALID_FILTER、EMPTY_FILTER、TYPE_MISMATCH、LIMIT_EXCEEDED、PERMISSION_DENIED400 / 40006步骤失败不重试;事件丢弃/死信
业务结果NOT_FOUND、DUPLICATE、CONFLICT200 / 20001步骤失败不重试;事件确认不重投
可重试TIMEOUT、UNAVAILABLE、DEADLOCK、STORAGE_ERROR,以及认不出的错误码、普通 Error503 / 50301按步骤 / 事件重试策略处理
注意:
没写 code 的 throw new Error(...) 落入可重试档。
accepted、通知已投递、请求超时都不等于设备或业务终态;对飞行、设备、任务和写操作,必须用业务 ID 查询权威状态。

常见问题#

现象原因与处理
抛错被反复重试错误码认不出(落可重试档);改用三分类里的标准错误码
HTTP 200 却当失败处理20001 是业务结果;成功判据只有 code === 0
前端 instanceof 判断错误类型失效跨隔离环境不可靠;用 error.code 判断
想看前端全部错误码见 SDK PLUGIN_ERROR_CODES 常量;本页只列常用项
修改于 2026-10-22 03:40:06
上一页
版本兼容性
下一页
术语表
Built with