Add cooperativeCatch as coroutine-safe alternative to runCatching #4059
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What is this?
This PR adds 2 new methods:
Both of these function the same way that
runCatching
andmapCatching
.However, these implementations obey cooperative cancellation by immediately propagating
CancellationException
instead of encapsulating it, asrunCatching
andmapCatching
do.Why do we want it?
Firstly, it is not immediately obvious to developers that
runCatching
may actually swallowCancellationException
and cause memory leaks when a suspend function is invoked insiderunCatching
. It is perfectly reasonable to assume that devs would think a language-provided feature would play nicely with another language-provided featureSecondly, many devs strongly prefer the functional style of
runCatching
over a typicaltry/catch
block. And they simply cannot use their preferred functional style of exception handling with the current state of coroutines. This PR gives devs the power to preserve their preferred programming style.Discussion on this topic can be found in this issue: #1814