spectreconsole/spectre.console · error · InvalidOperationException

Output writer was null

Error message

Output writer was null

What it means

Thrown by AnsiConsoleFactory.Create when settings.Out is non-null but its Writer property is null. The default AnsiConsoleOutput never exposes a null Writer (its constructor rejects null), so this only happens when a custom IAnsiConsoleOutput implementation returns null from its Writer getter. Creation cannot proceed without a writable target.

Source

Thrown at src/Spectre.Console/AnsiConsoleFactory.cs:15

namespace Spectre.Console;

/// <summary>
/// Factory for creating an ANSI console.
/// </summary>
internal sealed class AnsiConsoleFactory
{
    public static IAnsiConsole Create(AnsiConsoleSettings settings)
    {
        ArgumentNullException.ThrowIfNull(settings);

        var output = settings.Out ?? new AnsiConsoleOutput(System.Console.Out);
        if (output.Writer == null)
        {
            throw new InvalidOperationException("Output writer was null");
        }

        // Get the capabilities of the terminal
        var caps = Capabilities.Create(output.Writer, settings, out var encoding);

        // Create a profile using the capabilities and enrich it
        var profile = new Profile(output, caps, encoding);
        ProfileEnricher.Enrich(
            profile,
            settings.Enrichment,
            settings.EnvironmentVariables);

        return new AnsiConsoleFacade(
            profile,
            settings.ExclusivityMode ?? new DefaultExclusivityMode());
    }
}

View on GitHub (pinned to 0acc92fada)

Solutions

  1. Ensure your custom IAnsiConsoleOutput.Writer returns a non-null TextWriter (e.g. StringWriter or Console.Out)
  2. If you do not need a custom output, leave settings.Out null so the default Console.Out path is used
  3. Initialize the Writer before constructing the console, not lazily

Example fix

// before
settings.Out = new MyOutput { Writer = null };
var console = AnsiConsoleFactory.Create(settings); // throws

// after
settings.Out = new AnsiConsoleOutput(Console.Out); // or a StringWriter
var console = AnsiConsoleFactory.Create(settings);
Defensive patterns

Strategy: validation

Validate before calling

// Validate a custom IAnsiConsoleOutput before console creation
if (settings.Out is not null && settings.Out.Writer is null)
    throw new InvalidOperationException("settings.Out.Writer is null");

var console = AnsiConsoleFactory.Create(settings);

Type guard

static bool HasWriter(IAnsiConsoleOutput? out) => out?.Writer is not null;

Try / catch

try
{
    var console = AnsiConsoleFactory.Create(settings);
}
catch (InvalidOperationException ex) when (ex.Message == "Output writer was null")
{
    // custom IAnsiConsoleOutput returned a null Writer
}

Prevention

When it happens

Trigger: Passing AnsiConsoleSettings with Out set to a custom IAnsiConsoleOutput whose Writer is null.

Common situations: A custom/mocked IAnsiConsoleOutput that lazily resolves a TextWriter which has not been set; a decorator that forwards to an inner output whose Writer is null; a test double with an uninitialized Writer field.

Related errors


AI-assisted analysis of spectreconsole/spectre.console@0acc92fada (2026-08-13). Data as JSON: /api/errors/f4620ab4a082672b. Report an issue: GitHub.