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
- Ensure your custom IAnsiConsoleOutput.Writer returns a non-null TextWriter (e.g. StringWriter or Console.Out)
- If you do not need a custom output, leave settings.Out null so the default Console.Out path is used
- 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
- Prefer the built-in AnsiConsoleOutput over custom IAnsiConsoleOutput unless you need it
- Initialize your custom output's Writer eagerly, never lazily
- Unit-test custom outputs to confirm Writer is non-null
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
- Value cannot be null. (Parameter 'writer')
- Profile enricher of type '{enricher.GetType().FullName}' doe
- Cannot convert color to console color.
- Alternate buffers are not supported since your terminal does
- Value cannot be null. (Parameter 'obj')
AI-assisted analysis of spectreconsole/spectre.console@0acc92fada (2026-08-13).
Data as JSON: /api/errors/f4620ab4a082672b.
Report an issue: GitHub.