rwadurian/backend/mpc-system/services
hailin 62b2a87e90 fix(android): 为 MainViewModel 添加 safeLaunch 异常处理 [P2]
【架构安全修复 - 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>
2026-01-26 22:09:52 -08:00
..
account Revert "fix(co-keygen): convert threshold at storage time to match tss-lib convention" 2025-12-31 10:24:25 -08:00
message-router fix(message-router): prevent subscription race condition on gRPC reconnect 2026-01-01 10:04:11 -08:00
server-party fix(participate_signing): 恢复 Execute 方法的 UserShareData 分支 2026-01-26 19:00:52 -08:00
server-party-api fix(context): use parent context instead of Background() to allow proper cancellation 2025-12-06 06:36:34 -08:00
server-party-co-managed fix(co-managed): 使用数据库中的 PartyIndex 而非循环索引 2026-01-26 20:24:32 -08:00
service-party-android fix(android): 为 MainViewModel 添加 safeLaunch 异常处理 [P2] 2026-01-26 22:09:52 -08:00
service-party-app fix(tss): 修复备份恢复后签名失败的问题 2026-01-20 00:39:05 -08:00
session-coordinator feat(session): broadcast participant_joined event via gRPC for real-time UI updates 2026-01-01 08:34:47 -08:00
tss-wasm feat(tss): add real-time round progress from msg.Type() parsing 2026-01-01 22:41:51 -08:00