tui-cs/Terminal.Gui · error · ArgumentException

Invalid scheme name

Error message

Invalid scheme name: {schemeName}

What it means

GetScheme(Schemes) converts the enum to its name via SchemesToSchemeName (Enum.GetName). If the enum value is not a defined member (e.g. (Schemes)999 cast from an unchecked int), Enum.GetName returns null and this ArgumentException is thrown.

Solutions

  1. Validate the enum value with Enum.IsDefined(typeof(Schemes), value) before calling GetScheme.
  2. Use a known Schemes member (e.g. Schemes.TopLevel).

Example fix

// before
SchemeManager.GetScheme ((Schemes)999);
// after
Schemes s = (Schemes)999;
if (Enum.IsDefined (typeof (Schemes), s))
{
    SchemeManager.GetScheme (s);
}
Defensive patterns

Strategy: validation

Validate before calling

static bool IsDefinedScheme (Schemes s) => Enum.IsDefined (typeof (Schemes), s);

Try / catch

try { var scheme = SchemeManager.GetScheme (s); }
catch (ArgumentException ex) when (ex.Message.Contains ("Invalid scheme name"))
{ /* s is not a defined Schemes member */ }

Prevention

When it happens

Trigger: Calling GetScheme((Schemes)999) or GetScheme((Schemes)(-1)) — an enum value outside the defined Schemes members.

Common situations: Casting an unchecked integer to Schemes; deserializing an invalid numeric scheme id; arithmetic on enum values producing undefined members.

Related errors


AI-assisted analysis of tui-cs/Terminal.Gui@2e47b11478 (2026-08-13). Data as JSON: /api/errors/50b0d9cc37233298. Report an issue: GitHub.

Appendix: source

Thrown at Terminal.Gui/Configuration/SchemeManager.cs:122

        {
            throw new InvalidOperationException ($@"{schemeName}: Does not exist in Schemes.");
        }

        GetSchemes ().Remove (schemeName);
    }

    /// <summary>
    ///     Gets the <see cref="Scheme"/> for the specified <see cref="Drawing.Schemes"/>.
    /// </summary>
    /// <param name="schemeName"></param>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public static Scheme GetScheme (Schemes schemeName)
    {
        // Convert schemeName to string via Enum api
        string? schemeNameString = SchemesToSchemeName (schemeName);

        return schemeNameString is null ? throw new ArgumentException ($"Invalid scheme name: {schemeName}") : GetSchemesForCurrentTheme () [schemeNameString]!;
    }

    /// <summary>
    ///     Gets the <see cref="Scheme"/> for the specified string.
    /// </summary>
    /// <param name="schemeName"></param>
    /// <returns></returns>
    /// <exception cref="KeyNotFoundException">If <paramref name="schemeName"/> is not found in the current theme.</exception>
    public static Scheme GetScheme (string schemeName) => GetSchemesForCurrentTheme () [schemeName]!;

    /// <summary>
    ///     Attempts to get the <see cref="Scheme"/> for the specified name without throwing.
    ///     Returns <see langword="false"/> and sets <paramref name="scheme"/> to <see langword="null"/> if the scheme is
    ///     not found, or if the configuration is not in a state where schemes can be resolved.
    /// </summary>
    /// <param name="schemeName">The name of the scheme to retrieve.</param>
    /// <param name="scheme">
    ///     When this method returns <see langword="true"/>, contains the resolved <see cref="Scheme"/>; otherwise

View on GitHub (pinned to 2e47b11478)