Frontend error handling nekiro api error platform error view
Read-only mirror of
NeKiro-project/NeKiro-Console/.qoder/repowiki/knowledge/zh/前端错误处理:NekiroApiError 与 PlatformErrorView 统一模型/前端错误处理:NekiroApiError 与 PlatformErrorView 统一模型.md at 5e577d86825e2ff80434e752342990b9b313d947. The canonical document remains in the satellite repository; edit it there and refresh this snapshot.kind: error_handling name: 前端错误处理:NekiroApiError 与 PlatformErrorView 统一模型 category: error_handling scope: - '**' source_files: - src/api/nekiro.ts - src/types.ts - src/App.tsx
本仓库采用「单一异常类型 + 平台错误视图」的前端错误处理体系,集中在 src/api/nekiro.ts 中实现,并在 App.tsx 的每个异步操作处统一捕获、归一化并渲染。
1. 使用的系统与模式
- 自定义异常类:NekiroApiError extends Error,携带 HTTP status、业务 code、traceId,并提供 toView() 转换为 UI 层可消费的 PlatformErrorView。
- 统一错误视图类型:PlatformErrorView(定义于 types.ts)作为跨组件传递的错误载体,包含 status | code | message | traceId。
- API 客户端集中封装:NekiroApiClient.request
是唯一的网络入口,负责把原始 fetch 响应或网络异常统一包装为 NekiroApiError。 - 顶层 try/catch + toPlatformErrorView:App.tsx 中每个异步函数用 try/catch 包裹,调用 toPlatformErrorView(error, fallbackMessage) 将任意 unknown 错误归一化为 PlatformErrorView,再写入对应 useState。
2. 关键文件与位置
- src/api/nekiro.ts
- NekiroApiError 类(第 106–127 行)
- NekiroApiClient.request 统一请求/错误转换(第 235–276 行)
- toPlatformErrorView 归一化工具(第 375–384 行)
- 参数校验辅助函数 readText / readIdentifier / ensureUnique / isSemver 等抛出 Error(第 402–440 行)
- src/types.ts
- PlatformErrorView 接口(第 44–49 行)
- src/App.tsx
- 每个数据加载/写操作的 try/catch + setXxxError(toPlatformErrorView(...)) 模式(如第 43–50、56–68、78–86、109–118、169–176、182–189 行)
3. 架构与约定
- 错误来源分层
- 配置错误:baseUrl 为空时抛 NekiroApiError(0, ..., 'CONFIGURATION_ERROR')。
- 网络错误:fetch 抛错时捕获并转 NekiroApiError(0, ..., 'NETWORK_ERROR')。
- HTTP 错误:!response.ok 时解析后端 PlatformErrorPayload(支持 {code,message,traceId} 及嵌套 {error: {...}}),提取 x-nek-trace-id 响应头作为 fallback。
- 响应体错误:非 204 且 JSON 解析失败 → INVALID_RESPONSE。
- 客户端参数校验:在 buildAgentCard 及相关 helper 中直接 throw new Error('...'),由上层 toPlatformErrorView 兜底转为 CLIENT_ERROR。
- 错误传播路径 NekiroApiClient → NekiroApiError → App.tsx catch → toPlatformErrorView → PlatformErrorView state → Tab 组件以 errorBox 形式展示。
- 无全局中间件/拦截器:未使用 axios 或 fetch 拦截器,所有错误处理显式写在调用点,保持 MVP 阶段简单透明。
- 无 panic/recover:纯浏览器环境,不使用 throw 控制流以外的机制。
4. 开发者应遵循的规则
- 不要直接向上冒泡 Error:需要用户可见的错误一律通过 NekiroApiClient 发起;若需构造业务错误,优先使用 new NekiroApiError(status, message, code, traceId)。
- catch 后统一走 toPlatformErrorView:所有 catch (error) 分支必须调用 toPlatformErrorView(error, '友好提示'),禁止自行拼接 UI 字符串。
- 区分状态码与业务码:HTTP status 用于网络层判断,code(如 CONFIGURATION_ERROR / NETWORK_ERROR / INVALID_RESPONSE / CLIENT_ERROR)用于 UI 分类展示。
- traceId 透传:从后端 PlatformErrorPayload.error.traceId 或 x-nek-trace-id 头部获取,保留到 PlatformErrorView.traceId,便于联调定位。
- 参数校验错误归类为 CLIENT_ERROR:在 buildAgentCard 等输入构造函数中 throw new Error(...) 即可,无需手动包装。
- 避免在组件内 throw:UI 层只消费 PlatformErrorView,不要在 React 组件中直接 throw 导致整棵子树崩溃。