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
- Add a case for the new GridScreenName value with the matching BagXxxChecked/Unchecked ElementRecognition keys.
- If calling for ArtifactSalvage, use the dedicated salvage flow instead of OpenInventory.
- Guard callers: switch over known values or validate gridScreenName before invoking OpenInventory.
- 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
- Convert the switch to a switch expression so new enum members break compilation.
- Add unit tests covering every GridScreenName value.
- Never pass ArtifactSalvage to OpenInventory; use the dedicated flow.
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.