{"record":{"id":"0afe5fe47d5fca64","repo":"babalae/better-genshin-impact","slug":"error-0afe5f","errorCode":null,"errorMessage":"前往征讨之花任务异常结束","messagePattern":"前往征讨之花任务异常结束","errorType":"exception","errorClass":"TimeoutException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/AutoBoss/AutoBossTask.cs","lineNumber":1208,"sourceCode":"                if (navigationStopwatch.Elapsed >= navigationTimeout)\n                {\n                    throw new TimeoutException(\"超时未找到征讨之花领奖界面\");\n                }\n\n                var completedTask = await Task.WhenAny(Task.Delay(500, _ct),adjustCameraTask,moveToRewardTask,monitorRewardPromptTask);\n\n                if (completedTask == monitorRewardPromptTask)\n                {\n                    await monitorRewardPromptTask;\n                    _logger.LogInformation(\"{Name}：已进入征讨之花领奖界面\", Name);\n                    return;\n                }\n\n                if (completedTask == adjustCameraTask || completedTask == moveToRewardTask)\n                {\n                    navigationCts.Cancel();\n                    await completedTask;\n                    throw new TimeoutException(\"前往征讨之花任务异常结束\");\n                }\n            }\n        }\n        finally\n        {\n            navigationCts.Cancel();\n            try\n            {\n                await Task.WhenAll(adjustCameraTask, moveToRewardTask, monitorRewardPromptTask);\n            }\n            catch\n            {\n                // The main loop observes task failures; shutdown also cancels background tasks.\n            }\n\n            Simulation.SendInput.SimulateAction(GIActions.MoveForward, KeyType.KeyUp);\n            Simulation.SendInput.SimulateAction(GIActions.MoveLeft, KeyType.KeyUp);\n            Simulation.SendInput.SimulateAction(GIActions.MoveRight, KeyType.KeyUp);","sourceCodeStart":1190,"sourceCodeEnd":1226,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/AutoBoss/AutoBossTask.cs#L1190-L1226","documentation":"NavigateToReward 主循环中，若 adjustCameraTask 或 moveToRewardTask 先于 monitorRewardPromptTask 完成（无论成功结束还是抛异常），即判定为寻路子任务异常结束：取消导航令牌、await 该任务（使其异常上抛）后抛 TimeoutException。这说明辅助寻路任务没能持续运行到领奖界面出现。","triggerScenarios":"AdjustRewardCameraTask 或 MoveToRewardTask 内部提前 return（例如认为已到位但实际未触发领奖面板）；这两个任务内部抛出异常（OCR 失败、点击失败、坐标越界）；任务被外部取消。","commonSituations":"寻路子任务逻辑提前判定完成；子任务异常未在内部消化直接冒泡；角色卡住导致移动任务异常退出；OCR 区域漂移使子任务误判。","solutions":["检查 await completedTask 抛出的内部异常堆栈，定位是 Adjust 还是 Move 任务失败。","确保这两个辅助任务在领奖面板出现前不提前 return（改为只在确实检测到面板时退出）。","在子任务内部 catch 瞬时 OCR/点击异常并继续循环，而非整体结束。","校准相关 OCR 区域与文本匹配。"],"exampleFix":"// before\nif (completedTask == adjustCameraTask || completedTask == moveToRewardTask)\n{\n    navigationCts.Cancel();\n    await completedTask;\n    throw new TimeoutException(\"前往征讨之花任务异常结束\");\n}\n\n// after\nif (completedTask == adjustCameraTask || completedTask == moveToRewardTask)\n{\n    navigationCts.Cancel();\n    try { await completedTask; }\n    catch (Exception ex) { throw new TimeoutException($\"前往征讨之花任务异常结束：{completedTask == adjustCameraTask ? \"镜头调整\" : \"移动\"} 失败\", ex); }\n    throw new TimeoutException($\"前往征讨之花任务异常结束：{completedTask == adjustCameraTask ? \"镜头调整\" : \"移动\"} 提前完成\");\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { await NavigateToReward(); }\ncatch (TimeoutException ex) when (ex.Message.Contains(\"异常结束\"))\n{\n    _logger.LogError(\"{Name}：{Msg}\", Name, ex.ToString());\n    throw;\n}","preventionTips":["确保 Adjust/Move 子任务在领奖面板出现前不提前 return。","子任务内部消化瞬时异常，避免整体提前结束。","在 await completedTask 时保留内部异常堆栈以便定位。"],"tags":["navigation","task-scheduling","reward","genshin","autoboss"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}