Fairly certain scenario two isn't doing what you think it does.
Task cancellation is a cooperative process and the task you're cancelling isn't doing any of the checks needed to determine whether or not it's been cancelled.
Cancelling won't throw unless you do a `try Task.checkCancellation()` and since you're not doing that, your catch block isn't going to be hit on cancellation (if might be hit if the fetchData URLSession call times out and throws, but your timed task cancellation has nothing to do with that).