【架构安全修复 - ViewModel 层协程异常处理】 ## 问题背景 MainViewModel 使用的 viewModelScope 没有配置 CoroutineExceptionHandler: - 未捕获的异常会导致应用崩溃 - 用户操作触发的异常体验最差 - 有 29 处 viewModelScope.launch 调用都存在风险 ## 修复方案 ### 1. 添加 safeLaunch 辅助函数 创建一个扩展函数自动捕获异常: ### 2. 替换关键的 viewModelScope.launch 将 14 个最关键的用户交互点改为使用 safeLaunch: **已修复的函数:** 1. checkAllServices() - 服务初始化检查 2. connectToServer() - 连接服务器 3. createKeygenSession() - 创建密钥生成会话 4. validateInviteCode() - 验证邀请码 5. joinKeygen() - 加入密钥生成 6. joinSign() - 加入签名 7. initiateSignSession() - 发起签名会话 8. initiateSignSessionWithOptions() - 发起签名(带选项) 9. startSigningProcess() - 启动签名过程 10. prepareTransfer() - 准备转账 11. broadcastTransaction() - 广播交易 12. exportShareBackup() - 导出备份 13. importShareBackup() - 导入备份 14. confirmTransactionInBackground() - 后台确认交易 ## 修复的崩溃场景 ### 场景 1: 网络请求失败 - 原问题: 用户点击"创建钱包"时网络异常 - 修复前: 应用直接崩溃 ❌ - 修复后: 显示"网络错误"提示,应用继续运行 ✅ ### 场景 2: 参数验证失败 - 原问题: 邀请码格式错误抛出 IllegalArgumentException - 修复前: 应用崩溃 ❌ - 修复后: 显示"参数错误"提示 ✅ ### 场景 3: 状态不一致 - 原问题: 快速切换页面导致状态异常 - 修复前: 应用崩溃,用户丢失数据 ❌ - 修复后: 显示错误提示,状态可恢复 ✅ ### 场景 4: JSON 解析失败 - 原问题: 导入损坏的备份文件 - 修复前: 应用崩溃 ❌ - 修复后: 显示"导入失败"提示 ✅ ## 双重保护机制 现在有两层保护: 1. **内层 try-catch** - 函数内部的具体业务异常处理 2. **外层 safeLaunch** - 捕获所有未处理的异常,防止崩溃 示例: ## 异常分类处理 根据异常类型提供友好的错误提示: - SocketTimeoutException → "网络超时,请检查网络连接" - UnknownHostException → "无法连接到服务器,请检查网络设置" - IOException → "网络错误: {message}" - IllegalStateException → "状态错误: {message}" - IllegalArgumentException → "参数错误: {message}" - 其他异常 → "操作失败: {message}" ## 影响范围 ### 修改的代码位置 - MainViewModel.kt - 添加 safeLaunch 函数 - 14 个关键用户交互函数 - 替换 viewModelScope.launch 为 safeLaunch ### 行为变化 - BEFORE: 协程中未捕获异常导致应用崩溃 - AFTER: 异常被捕获,显示错误提示,应用继续运行 ### 完全向后兼容 - 所有现有的 try-catch 逻辑保持不变 - 仅在异常未被捕获时才触发 safeLaunch 的处理 - 不影响正常的业务流程 ## 测试验证 编译状态: ✅ BUILD SUCCESSFUL in 29s - 无编译错误 - 仅有警告 (unused parameters),不影响功能 ## 与 TssRepository 形成完整防护 现在有两层完整的异常保护: 1. **TssRepository 层** - 后台协程的异常处理 (CoroutineExceptionHandler) 2. **MainViewModel 层** - UI 交互的异常处理 (safeLaunch) 用户操作流程: 用户点击按钮 → MainViewModel.safeLaunch (外层保护) ↓ Repository 调用 → repositoryScope (后台保护) ↓ 双重保护,极大降低崩溃风险 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| backend | ||
| contracts | ||
| docs | ||
| frontend | ||
| kubernetes | ||
| scripts | ||
| tests | ||
| .gitignore | ||
| README.md | ||
| SEED01-qrcode.png | ||
| STKAITI.TTF | ||
| contract.docx | ||
| docker-compose.yml | ||
| 挖矿.xlsx | ||
| 榴莲皇后数据.xlsx | ||
| 联合种植协议董事长_release_form.pdf | ||