## 1. 总体方法 本仓库的「错误处理」由三块构成: - **Python 服务端 (esp32_server.py)**:大量使用裸 `except Exception:` 包裹每个 I/O / 子进程/线程入口,把网络/文件/Windows 句柄异常吞掉并继续运行;不存在自定义异常类型体系。 - **前端工具脚本 (scripts/*.py)**:通过 `raise SystemExit(...)` + `urllib.error.HTTPError` 区分成功/失败路径,主流程用 try 捕获异常后终止。**没有**统一的 Result/Either 封装。 - **浏览器前端 (js/…)**:采用「Promise + fetch AbortSignal.timeout → throw Error」的异步错误模型;所有可见故障统一经 `toast.js` 的 `showToast(msg, 'success'|'error'|'warning')` 在 UI 弹出(5s 去重),并通过 `log.js` 的 `addLog(level, tag, msg)` 结构化写入页面日志面板。BLE OTA、OTA 上传等长链路则在各自模块内维护状态机 (`stages.js` / `progress.js` / `session.js`),通过 `setBleStageError`、`cleanupAfterOtaFailure` 等函数显式转入错误阶段。