{"record":{"id":"ed19f43b87692c49","repo":"babalae/better-genshin-impact","slug":"gridscreenname-getdescription","errorCode":null,"errorMessage":"背包不支持的界面：{gridScreenName.GetDescription()}","messagePattern":"背包不支持的界面：(.+?)","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs","lineNumber":135,"sourceCode":"                break;\n            case GridScreenName.Gadget:\n                recognitionObjectChecked = ElementRecognition.Get(\"BagGadgetChecked\");\n                recognitionObjectUnchecked = ElementRecognition.Get(\"BagGadgetUnchecked\");\n                break;\n            case GridScreenName.Quest:\n                recognitionObjectChecked = ElementRecognition.Get(\"BagQuestChecked\");\n                recognitionObjectUnchecked = ElementRecognition.Get(\"BagQuestUnchecked\");\n                break;\n            case GridScreenName.PreciousItems:\n                recognitionObjectChecked = ElementRecognition.Get(\"BagPreciousItemChecked\");\n                recognitionObjectUnchecked = ElementRecognition.Get(\"BagPreciousItemUnchecked\");\n                break;\n            case GridScreenName.Furnishings:\n                recognitionObjectChecked = ElementRecognition.Get(\"BagFurnishingChecked\");\n                recognitionObjectUnchecked = ElementRecognition.Get(\"BagFurnishingUnchecked\");\n                break;\n            default:\n                throw new NotSupportedException($\"背包不支持的界面：{gridScreenName.GetDescription()}\");\n        }\n\n        // B键打开背包\n        input.SimulateAction(GIActions.OpenInventory);\n        await Delay(1200, ct);\n\n        var openBagSuccess = await NewRetry.WaitForAction(() =>\n        {\n            using var ra = CaptureToRectArea();\n\n            // 判断是否在提示对话框（物品过期提示）\n            if (Bv.IsInPromptDialog(ra))\n            {\n                // 如果存在物品过期提示，则点击确认按钮\n                Bv.ClickWhiteConfirmButton(ra, new Rect(0, 0, ra.Width, (int)Math.Round(ra.Height - ra.Height * 0.2)));\n                Sleep(300, ct);\n                return false;\n            }","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs#L117-L153","documentation":"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.","triggerScenarios":"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.","commonSituations":"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).","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."],"exampleFix":"// before\nswitch (gridScreenName)\n{\n    case GridScreenName.Weapons: ...; break;\n    ...\n    default: throw new NotSupportedException(...);\n}\n// after - make compiler enforce exhaustiveness\nRecognitionObject recognitionObjectChecked = gridScreenName switch\n{\n    GridScreenName.Weapons => ElementRecognition.Get(\"BagWeaponChecked\"),\n    // ... add all cases; compiler errors on missing members\n};","handlingStrategy":"type-guard","validationCode":"static readonly HashSet<GridScreenName> OpenableScreens = new()\n{\n    GridScreenName.Weapons, GridScreenName.Artifacts, GridScreenName.CharacterDevelopmentItems,\n    GridScreenName.Food, GridScreenName.Materials, GridScreenName.Gadget,\n    GridScreenName.Quest, GridScreenName.PreciousItems, GridScreenName.Furnishings\n};\nif (!OpenableScreens.Contains(gridScreenName)) throw new ArgumentOutOfRangeException(nameof(gridScreenName));","typeGuard":"static bool CanOpenInventory(GridScreenName name) => name switch\n{\n    GridScreenName.Weapons or GridScreenName.Artifacts or GridScreenName.CharacterDevelopmentItems\n        or GridScreenName.Food or GridScreenName.Materials or GridScreenName.Gadget\n        or GridScreenName.Quest or GridScreenName.PreciousItems or GridScreenName.Furnishings => true,\n    _ => false\n};","tryCatchPattern":null,"preventionTips":["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."],"tags":["game-task","enum","switch","bug"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}