12 KiB
12 KiB
问题修复 - 功能未开启错误码识别 v3.12.2
版本: v3.12.2
日期: 2025-10-08
类型: 问题修复
问题描述
用户反馈在批量任务执行时遇到两个错误:
错误1:一键答题失败
一键答题失败
服务器错误: 200160 - 未知错误
实际情况:游戏未开启答题模块(等级不够或功能未解锁)
错误2:领取挂机奖励失败
领取挂机奖励失败
服务器错误: -10006 - 未知错误
实际情况:游戏未开启挂机奖励模块(等级不够或功能未解锁)
问题分析
这两个错误都是由于游戏功能未解锁导致的,属于正常情况:
- 新账号或等级较低的账号可能还未解锁某些功能
- 不同服务器的功能开启条件可能不同
- 这些错误不应该被标记为"失败",而应该被识别为"功能未开启,跳过"
错误码说明
一键答题相关错误码
| 错误码 | 含义 | 原处理方式 | 修复后处理方式 |
|---|---|---|---|
3100080 |
答题次数已用完或功能未开启 | ✅ 跳过,视为成功 | ✅ 跳过,视为成功 |
200160 |
答题功能未开启 | ❌ 标记为失败 | ✅ 跳过,视为成功 |
领取挂机奖励相关错误码
| 错误码 | 含义 | 原处理方式 | 修复后处理方式 |
|---|---|---|---|
-10006 |
挂机奖励功能未开启 | ❌ 标记为失败 | ✅ 跳过,视为成功 |
解决方案
修改1:一键答题 (autoStudy)
在已有的 3100080 错误码处理基础上,增加对 200160 错误码的识别:
修改前
} catch (error) {
const errorMsg = error.message || String(error)
// 错误码 3100080 通常表示答题次数已用完或答题未开启
if (errorMsg.includes('3100080')) {
console.log(`⚠️ [${tokenId}] 答题任务: 答题次数已用完或功能未开启`)
return {
task: '一键答题',
taskId: 'auto_study',
success: true,
skipped: true,
message: '答题次数已用完或功能未开启'
}
}
throw error
}
修改后
} catch (error) {
const errorMsg = error.message || String(error)
// 错误码 3100080 或 200160 表示答题次数已用完或答题功能未开启
if (errorMsg.includes('3100080') || errorMsg.includes('200160')) {
console.log(`⚠️ [${tokenId}] 答题任务: 答题次数已用完或功能未开启`)
return {
task: '一键答题',
taskId: 'auto_study',
success: true, // 视为成功,不影响整体任务
skipped: true,
message: '答题次数已用完或功能未开启'
}
}
// 其他错误正常抛出
throw error
}
修改2:领取挂机奖励 (claimHangupReward)
将原本简单的 executeSubTask 包装改为带错误处理的 try-catch 结构:
修改前
case 'claimHangupReward':
// 领取奖励(领取挂机时间)
return await executeSubTask(
tokenId,
'claim_hangup_reward',
'领取挂机奖励',
async () => await client.sendWithPromise('system_claimhangupreward', {}, 3000),
false
)
修改后
case 'claimHangupReward':
// 领取挂机奖励
return await executeSubTask(
tokenId,
'claim_hangup_reward',
'领取挂机奖励',
async () => {
try {
const result = await client.sendWithPromise('system_claimhangupreward', {}, 3000)
return result
} catch (error) {
const errorMsg = error.message || String(error)
// 错误码 -10006 表示挂机奖励功能未开启
if (errorMsg.includes('-10006')) {
console.log(`⚠️ [${tokenId}] 领取挂机奖励: 功能未开启`)
return {
notEnabled: true,
message: '挂机奖励功能未开启'
}
}
// 其他错误正常抛出
throw error
}
},
false
)
修改文件
src/stores/batchTaskStore.js
修改位置1: Line 1206-1207 (autoStudy)
- 将
errorMsg.includes('3100080')改为errorMsg.includes('3100080') || errorMsg.includes('200160') - 更新注释说明包含两个错误码
修改位置2: Line 1222-1249 (claimHangupReward)
- 将简单的函数调用改为 try-catch 包装
- 添加对
-10006错误码的识别 - 返回
{ notEnabled: true }表示功能未开启
用户体验改进
一键答题
修改前:
执行进度详情
┌─────────────────────────────┐
│ ❌ 一键答题 │
│ 服务器错误: 200160 - │
│ 未知错误 │
└─────────────────────────────┘
统计:
- 总任务: 7
- 成功: 6
- 失败: 1 ← 误判
修改后:
执行进度详情
┌─────────────────────────────┐
│ ✅ 一键答题 │
│ 答题次数已用完或功能 │
│ 未开启 │
└─────────────────────────────┘
统计:
- 总任务: 7
- 成功: 7 ← 正确识别
- 失败: 0
领取挂机奖励
修改前:
执行进度详情
┌─────────────────────────────┐
│ ❌ 领取挂机奖励 │
│ 服务器错误: -10006 - │
│ 未知错误 │
└─────────────────────────────┘
统计:
- 总任务: 7
- 成功: 6
- 失败: 1 ← 误判
修改后:
执行进度详情
┌─────────────────────────────┐
│ ✅ 领取挂机奖励 │
│ 挂机奖励功能未开启 │
└─────────────────────────────┘
统计:
- 总任务: 7
- 成功: 7 ← 正确识别
- 失败: 0
控制台日志
一键答题:
// 修改前
❌ [10694服-0-7167...] 一键答题失败: 服务器错误: 200160 - 未知错误
// 修改后
⚠️ [10694服-0-7167...] 答题任务: 答题次数已用完或功能未开启
领取挂机奖励:
// 修改前
❌ [10694服-0-7167...] 领取挂机奖励失败: 服务器错误: -10006 - 未知错误
// 修改后
⚠️ [10694服-0-7167...] 领取挂机奖励: 功能未开启
功能开启条件
一键答题功能
通常需要满足以下条件之一:
- 账号等级达到一定要求(如15级)
- 完成特定的主线任务
- 服务器开启答题活动
挂机奖励功能
通常需要满足以下条件:
- 账号等级达到一定要求(如10级)
- 解锁挂机系统
- 完成新手引导
技术要点
1. 错误码识别优先级
在错误处理中,应优先识别"可预期的非错误状态":
// 优先级1: 功能未开启(视为成功,跳过)
if (errorMsg.includes('200160') || errorMsg.includes('3100080')) {
return { success: true, skipped: true }
}
// 优先级2: 其他可识别错误
// ...
// 优先级3: 未知错误(抛出)
throw error
2. 返回格式统一
对于"功能未开启"的情况,统一返回格式:
{
task: '任务名称',
taskId: 'task_id',
success: true, // 标记为成功
skipped: true, // 标记为跳过
message: '友好的提示信息'
}
3. executeSubTask 的返回处理
当 executor 函数返回一个对象时,executeSubTask 会将其包装为:
{
task: taskName,
taskId: taskId,
success: true,
data: {
notEnabled: true, // executor 返回的内容
message: '...'
},
skipped: false
}
这样也能正确表示"成功但功能未开启"的状态。
特殊错误码格式
负数错误码
错误码 -10006 是一个负数,这在游戏服务器中比较少见:
- 可能表示系统级错误
- 可能表示配置未加载
- 需要使用
errorMsg.includes('-10006')进行字符串匹配
相关错误码汇总
答题相关
| 错误码 | 含义 | 处理方式 | 版本 |
|---|---|---|---|
3100080 |
答题次数已用完或功能未开启 | ✅ 成功(跳过) | v3.11.5 |
200160 |
答题功能未开启 | ✅ 成功(跳过) | v3.12.2 |
挂机奖励相关
| 错误码 | 含义 | 处理方式 | 版本 |
|---|---|---|---|
-10006 |
挂机奖励功能未开启 | ✅ 成功(跳过) | v3.12.2 |
其他功能相关
| 错误码 | 功能 | 含义 | 处理方式 |
|---|---|---|---|
2300190 |
俱乐部签到 | 今日已签到 | ✅ 成功 |
200020 |
俱乐部签到 | 今日已签到 | ✅ 成功 |
2300070 |
俱乐部签到/发车 | 未加入俱乐部 | ❌ 失败 |
200350 |
发车 | 非发车时间 | ⚠️ 跳过 |
测试验证
测试场景1:低等级账号(功能未开启)
账号等级: 5级
答题功能: 未解锁
挂机奖励: 未解锁
执行结果:
- ✅ 一键答题: 答题次数已用完或功能未开启(跳过)
- ✅ 领取挂机奖励: 挂机奖励功能未开启(跳过)
- 总任务: 7
- 成功: 7
- 失败: 0
测试场景2:高等级账号(功能已开启)
账号等级: 50级
答题功能: 已解锁
挂机奖励: 已解锁
执行结果:
- ✅ 一键答题: 答题完成
- ✅ 领取挂机奖励: 领取成功
- 总任务: 7
- 成功: 7
- 失败: 0
测试场景3:答题次数已用完
账号等级: 50级
答题功能: 已解锁
今日答题: 已完成
执行结果:
- ✅ 一键答题: 答题次数已用完或功能未开启(跳过)
(错误码可能是 3100080 或 200160)
- 总任务: 7
- 成功: 7
- 失败: 0
最佳实践
1. 功能未开启的识别
对于"功能未开启"类的错误,应该:
- ✅ 识别为成功状态(不影响整体任务)
- ✅ 标记为跳过(
skipped: true) - ✅ 提供友好的提示信息
- ❌ 不应标记为失败
2. 错误消息优化
// ❌ 不好的做法:显示原始错误码
return { error: '服务器错误: 200160 - 未知错误' }
// ✅ 好的做法:提供友好的说明
return {
success: true,
skipped: true,
message: '答题功能未开启'
}
3. 批量任务中的处理
在批量任务中,应区分:
- 真正的失败:需要重试或用户处理
- 可预期的跳过:功能未开启、已完成等
- 成功:正常执行成功
使用建议
对于用户
如果看到"功能未开启"的提示:
- 不用担心:这不是错误,而是正常的状态
- 提升等级:继续升级角色,解锁更多功能
- 关注任务:完成主线任务,通常会解锁新功能
- 自定义模板:可以创建不包含未解锁功能的任务模板
对于开发者
添加新功能时,应考虑:
- 功能未开启的错误码是什么
- 如何友好地处理这些错误
- 是否需要区分"未开启"和"已用完"
相关版本
- v3.11.5: 首次添加错误码 3100080 识别(答题)
- v3.12.1: 添加错误码 200020 识别(俱乐部签到)
- v3.12.2: 添加错误码 200160 和 -10006 识别(本版本)
总结
问题:
- ❌ 错误码 200160(答题功能未开启)被识别为失败
- ❌ 错误码 -10006(挂机奖励功能未开启)被识别为失败
- ❌ 影响低等级账号的批量任务成功率
修复:
- ✅ 识别错误码 200160 为"答题功能未开启"
- ✅ 识别错误码 -10006 为"挂机奖励功能未开启"
- ✅ 标记为成功(跳过)状态,不影响整体任务
效果:
- ✅ 低等级账号也能正常执行批量任务
- ✅ 避免误判功能未开启为失败
- ✅ 提供友好的提示信息
- ✅ 提高批量任务成功率统计准确性
状态: ✅ 已修复
版本: v3.12.2