davenewza's answer suffices if catching the exceptions from tasks application wide is acceptable.
If not then you have to do what you don't want to do (observe the exception in some way). You have two options:
- Create a continuation for each task that runs in the
OnlyOnFaulted
case whose only job is to observe the exception by looking at theException
property on the task. In your continuation for ContinueWhenAll, you can split the tasks into those with exceptions and those without:
Task.Factory.ContinueWhenAll(tasks, ts => { var lookup = ts.ToLookup(t => t.Exception != null); var faultedTasks = lookup[true]; var nonFaultedTasks = lookup[false]; });