Quick answer: Godot 4 C# Task.WhenAll throwing on a single task failure, masking other task completions? WhenAll waits for all; uses AggregateException - catch and inspect.

Batch of 10 async loads; one fails; exception thrown; other 9 results lost.

Catch AggregateException

try {{ await Task.WhenAll(tasks); }}
catch (AggregateException ex) {{ inspect each }}

Inspect each inner exception; partial success possible.

Or use ContinueWith

Per-task continuation. Each handles its own failure; aggregate decides what to do with successes.

Don't fail-fast

For batch loads, partial success often preferred. Design for it.

“WhenAll is fail-fast. Aggregate exceptions are the recovery surface.”

If your project does batch async work, the AggregateException pattern is mandatory. Document.

Related reading