Start here. This is the direct spoken answer to practice first.
Why this question matters
Exception behavior around Task.WhenAll is easy to misunderstand. This drill matters when APIs fan out to multiple dependencies and need useful failure handling.
Task.WhenAll returns a Task that completes after every supplied task has finished. If any task faults, the combined task faults; awaiting it throws an exception from the failed work. When several tasks fail, I keep the combined task or the individual task references so I can inspect all fault details instead of treating the first thrown exception as the complete picture. If no task faults but at least one is canceled, the combined task completes as canceled.