babalae/better-genshin-impact · error · TimeoutException

前往征讨之花任务异常结束

Error message

前往征讨之花任务异常结束

What it means

NavigateToReward 主循环中,若 adjustCameraTask 或 moveToRewardTask 先于 monitorRewardPromptTask 完成(无论成功结束还是抛异常),即判定为寻路子任务异常结束:取消导航令牌、await 该任务(使其异常上抛)后抛 TimeoutException。这说明辅助寻路任务没能持续运行到领奖界面出现。

Source

Thrown at BetterGenshinImpact/GameTask/AutoBoss/AutoBossTask.cs:1208

                if (navigationStopwatch.Elapsed >= navigationTimeout)
                {
                    throw new TimeoutException("超时未找到征讨之花领奖界面");
                }

                var completedTask = await Task.WhenAny(Task.Delay(500, _ct),adjustCameraTask,moveToRewardTask,monitorRewardPromptTask);

                if (completedTask == monitorRewardPromptTask)
                {
                    await monitorRewardPromptTask;
                    _logger.LogInformation("{Name}:已进入征讨之花领奖界面", Name);
                    return;
                }

                if (completedTask == adjustCameraTask || completedTask == moveToRewardTask)
                {
                    navigationCts.Cancel();
                    await completedTask;
                    throw new TimeoutException("前往征讨之花任务异常结束");
                }
            }
        }
        finally
        {
            navigationCts.Cancel();
            try
            {
                await Task.WhenAll(adjustCameraTask, moveToRewardTask, monitorRewardPromptTask);
            }
            catch
            {
                // The main loop observes task failures; shutdown also cancels background tasks.
            }

            Simulation.SendInput.SimulateAction(GIActions.MoveForward, KeyType.KeyUp);
            Simulation.SendInput.SimulateAction(GIActions.MoveLeft, KeyType.KeyUp);
            Simulation.SendInput.SimulateAction(GIActions.MoveRight, KeyType.KeyUp);

View on GitHub (pinned to a7cb36712d)

Solutions

  1. 检查 await completedTask 抛出的内部异常堆栈,定位是 Adjust 还是 Move 任务失败。
  2. 确保这两个辅助任务在领奖面板出现前不提前 return(改为只在确实检测到面板时退出)。
  3. 在子任务内部 catch 瞬时 OCR/点击异常并继续循环,而非整体结束。
  4. 校准相关 OCR 区域与文本匹配。

Example fix

// before
if (completedTask == adjustCameraTask || completedTask == moveToRewardTask)
{
    navigationCts.Cancel();
    await completedTask;
    throw new TimeoutException("前往征讨之花任务异常结束");
}

// after
if (completedTask == adjustCameraTask || completedTask == moveToRewardTask)
{
    navigationCts.Cancel();
    try { await completedTask; }
    catch (Exception ex) { throw new TimeoutException($"前往征讨之花任务异常结束:{completedTask == adjustCameraTask ? "镜头调整" : "移动"} 失败", ex); }
    throw new TimeoutException($"前往征讨之花任务异常结束:{completedTask == adjustCameraTask ? "镜头调整" : "移动"} 提前完成");
}
Defensive patterns

Strategy: retry

Try / catch

try { await NavigateToReward(); }
catch (TimeoutException ex) when (ex.Message.Contains("异常结束"))
{
    _logger.LogError("{Name}:{Msg}", Name, ex.ToString());
    throw;
}

Prevention

When it happens

Trigger: AdjustRewardCameraTask 或 MoveToRewardTask 内部提前 return(例如认为已到位但实际未触发领奖面板);这两个任务内部抛出异常(OCR 失败、点击失败、坐标越界);任务被外部取消。

Common situations: 寻路子任务逻辑提前判定完成;子任务异常未在内部消化直接冒泡;角色卡住导致移动任务异常退出;OCR 区域漂移使子任务误判。

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/0afe5fe47d5fca64. Report an issue: GitHub.