babalae/better-genshin-impact · error · NotSupportedException

背包不支持的界面:{gridScreenName.GetDescription()}

Error message

背包不支持的界面:{gridScreenName.GetDescription()}

What it means

Thrown by the static OpenInventory switch when GridScreenName is a value outside the handled set (Weapons, Artifacts, CharacterDevelopmentItems, Food, Materials, Gadget, Quest, PreciousItems, Furnishings). NotSupportedException signals a programming error: a new enum member was added without a corresponding case, or a caller passed an unsupported screen.

Source

Thrown at BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs:135

                break;
            case GridScreenName.Gadget:
                recognitionObjectChecked = ElementRecognition.Get("BagGadgetChecked");
                recognitionObjectUnchecked = ElementRecognition.Get("BagGadgetUnchecked");
                break;
            case GridScreenName.Quest:
                recognitionObjectChecked = ElementRecognition.Get("BagQuestChecked");
                recognitionObjectUnchecked = ElementRecognition.Get("BagQuestUnchecked");
                break;
            case GridScreenName.PreciousItems:
                recognitionObjectChecked = ElementRecognition.Get("BagPreciousItemChecked");
                recognitionObjectUnchecked = ElementRecognition.Get("BagPreciousItemUnchecked");
                break;
            case GridScreenName.Furnishings:
                recognitionObjectChecked = ElementRecognition.Get("BagFurnishingChecked");
                recognitionObjectUnchecked = ElementRecognition.Get("BagFurnishingUnchecked");
                break;
            default:
                throw new NotSupportedException($"背包不支持的界面:{gridScreenName.GetDescription()}");
        }

        // B键打开背包
        input.SimulateAction(GIActions.OpenInventory);
        await Delay(1200, ct);

        var openBagSuccess = await NewRetry.WaitForAction(() =>
        {
            using var ra = CaptureToRectArea();

            // 判断是否在提示对话框(物品过期提示)
            if (Bv.IsInPromptDialog(ra))
            {
                // 如果存在物品过期提示,则点击确认按钮
                Bv.ClickWhiteConfirmButton(ra, new Rect(0, 0, ra.Width, (int)Math.Round(ra.Height - ra.Height * 0.2)));
                Sleep(300, ct);
                return false;
            }

View on GitHub (pinned to a7cb36712d)

Solutions

  1. Add a case for the new GridScreenName value with the matching BagXxxChecked/Unchecked ElementRecognition keys.
  2. If calling for ArtifactSalvage, use the dedicated salvage flow instead of OpenInventory.
  3. Guard callers: switch over known values or validate gridScreenName before invoking OpenInventory.
  4. Turn the switch into an expression with exhaustiveness checking so new enum members break the build.

Example fix

// before
switch (gridScreenName)
{
    case GridScreenName.Weapons: ...; break;
    ...
    default: throw new NotSupportedException(...);
}
// after - make compiler enforce exhaustiveness
RecognitionObject recognitionObjectChecked = gridScreenName switch
{
    GridScreenName.Weapons => ElementRecognition.Get("BagWeaponChecked"),
    // ... add all cases; compiler errors on missing members
};
Defensive patterns

Strategy: type-guard

Validate before calling

static readonly HashSet<GridScreenName> OpenableScreens = new()
{
    GridScreenName.Weapons, GridScreenName.Artifacts, GridScreenName.CharacterDevelopmentItems,
    GridScreenName.Food, GridScreenName.Materials, GridScreenName.Gadget,
    GridScreenName.Quest, GridScreenName.PreciousItems, GridScreenName.Furnishings
};
if (!OpenableScreens.Contains(gridScreenName)) throw new ArgumentOutOfRangeException(nameof(gridScreenName));

Type guard

static bool CanOpenInventory(GridScreenName name) => name switch
{
    GridScreenName.Weapons or GridScreenName.Artifacts or GridScreenName.CharacterDevelopmentItems
        or GridScreenName.Food or GridScreenName.Materials or GridScreenName.Gadget
        or GridScreenName.Quest or GridScreenName.PreciousItems or GridScreenName.Furnishings => true,
    _ => false
};

Prevention

When it happens

Trigger: Passing GridScreenName.ArtifactSalvage or any future enum value to OpenInventory; an enum member added to GridScreenName but no case added here; default(GridScreenName) (value 0) if the enum has no zero alias handled.

Common situations: Refactor added a new bag tab to GridScreenName without updating OpenInventory; a task reuses OpenInventory for a screen it was not designed for (e.g. ArtifactSalvage grid which has its own flow).

Related errors


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