上一提交修了并发 map 写的问题(fatal error,不可 recover)。 这次给引擎加一层普通 panic 的兜底: - safeRunTask:画廊级别,panic 时把该画廊标记失败 + 记日志 - safeDownloadPage:页级别,一页出错不带走整个 worker - 恢复代码本身再包一层 recover —— 万一 panic 根因就是 store 出问题, 恢复逻辑不该二次崩溃逃逸出去 这不能替代修 bug(runtime fatal error 依然拦不住), 但能保证「将来再出别的内部错误」时用户能看到日志, 而不是应用无声消失、已下载的文件也白搭。 TestSafeRunTaskRecoversPanic 验证 recover 生效 (该测试在写第一版时还真抓出了恢复代码的二次 panic 隐患)。