{"record":{"id":"98de63c631aeba70","repo":"netchx/netch","slug":"unknown-mode-type","errorCode":null,"errorMessage":"Unknown Mode Type","messagePattern":"Unknown Mode Type","errorType":"exception","errorClass":"MessageException","httpStatus":null,"severity":"error","filePath":"Netch/Services/ModeService.cs","lineNumber":113,"sourceCode":"        if (File.Exists(mode.FullName))\n            File.Delete(mode.FullName);\n    }\n\n    public static IModeController GetModeControllerByType(ModeType type, out ushort? port, out string portName)\n    {\n        port = null;\n        portName = string.Empty;\n        switch (type)\n        {\n            case ModeType.ProcessMode:\n                return new NFController();\n            case ModeType.TunMode:\n                return new TUNController();\n            case ModeType.ShareMode:\n                return new PcapController();\n            default:\n                Log.Error(\"Unknown Mode Type \\\"{Type}\\\"\", (int)type);\n                throw new MessageException(\"Unknown Mode Type\");\n        }\n    }\n}","sourceCodeStart":95,"sourceCodeEnd":116,"githubUrl":"https://github.com/netchx/netch/blob/9d99eb1c5a2acbf2a34f2600f94242601019a300/Netch/Services/ModeService.cs#L95-L116","documentation":"GetModeControllerByType maps a ModeType to its IModeController: ProcessMode->NFController, TunMode->TUNController, ShareMode->PcapController. The default arm is a defensive guard - the ModeType enum currently defines only those three members, so reaching default requires a future enum member added without a case, or an invalid/out-of-range ModeType arriving from deserialization. It logs the numeric value then throws MessageException.","triggerScenarios":"A code change adds a new ModeType enum member but forgets to add a case here; deserialization of a mode JSON with a ModeType value outside the enum's defined range; an unsafe cast producing an invalid enum integer.","commonSituations":"Branch development adding a new mode type incompletely; corrupted mode file yielding a bad ModeType; essentially unreachable in a clean shipping build.","solutions":["Add a case for the new ModeType returning its controller (e.g. case ModeType.NewMode: return new NewController();).","If using a custom mode, ensure its ModeType is one of ProcessMode/TunMode/ShareMode.","Validate the deserialized ModeType with Enum.IsDefined before calling this method.","Convert the switch to an exhaustive expression switch so the compiler flags a missing case when a new member is added."],"exampleFix":"// before\ndefault:\n    Log.Error(\"Unknown Mode Type \\\"{Type}\\\"\", (int)type);\n    throw new MessageException(\"Unknown Mode Type\");\n// after - exhaustive expression switch with compiler enforcement\nreturn type switch\n{\n    ModeType.ProcessMode => new NFController(),\n    ModeType.TunMode     => new TUNController(),\n    ModeType.ShareMode   => new PcapController(),\n    _ => throw new InvalidOperationException($\"ModeType {(int)type} has no controller\")\n};","handlingStrategy":"validation","validationCode":"if (!Enum.IsDefined(typeof(ModeType), type))\n    throw new MessageException($\"Invalid ModeType {type}\");","typeGuard":"bool IsKnownModeType(ModeType t) => t is ModeType.ProcessMode or ModeType.TunMode or ModeType.ShareMode;","tryCatchPattern":"try { var ctrl = ModeService.GetModeControllerByType(type, out _, out _); }\ncatch (MessageException ex) when (ex.Message == \"Unknown Mode Type\")\n{\n    Log.Error(\"Cannot start: mode type {Type} unsupported in this build\", type);\n}","preventionTips":["Convert the switch to an exhaustive expression switch so the compiler flags a missing case when a new enum member is added.","Run Enum.IsDefined on deserialized ModeType values.","Cover all enum members in unit tests for GetModeControllerByType."],"tags":["mode","controller","enum","guard","switch"],"backgroundTag":null,"analyzedSha":"9d99eb1c5a2acbf2a34f2600f94242601019a300","analyzedAt":"2026-08-13T14:12:19.105Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}