gh-113848: Handle CancelledError subclasses in asyncio TaskGroup() and timeout() (GH-113850)

This commit is contained in:
Serhiy Storchaka 2024-01-09 21:41:31 +02:00 committed by GitHub
parent 5273655bea
commit a5db6a3351
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 7 deletions

View file

@ -73,8 +73,10 @@ class TaskGroup:
self._base_error is None):
self._base_error = exc
propagate_cancellation_error = \
exc if et is exceptions.CancelledError else None
if et is not None and issubclass(et, exceptions.CancelledError):
propagate_cancellation_error = exc
else:
propagate_cancellation_error = None
if self._parent_cancel_requested:
# If this flag is set we *must* call uncancel().
if self._parent_task.uncancel() == 0:
@ -133,7 +135,7 @@ class TaskGroup:
if propagate_cancellation_error and not self._errors:
raise propagate_cancellation_error
if et is not None and et is not exceptions.CancelledError:
if et is not None and not issubclass(et, exceptions.CancelledError):
self._errors.append(exc)
if self._errors:

View file

@ -109,10 +109,11 @@ class Timeout:
if self._state is _State.EXPIRING:
self._state = _State.EXPIRED
if self._task.uncancel() <= self._cancelling and exc_type is exceptions.CancelledError:
# Since there are no new cancel requests, we're
# handling this.
raise TimeoutError from exc_val
if self._task.uncancel() <= self._cancelling and exc_type is not None:
if issubclass(exc_type, exceptions.CancelledError):
# Since there are no new cancel requests, we're
# handling this.
raise TimeoutError from exc_val
elif self._state is _State.ENTERED:
self._state = _State.EXITED

View file

@ -0,0 +1,3 @@
:func:`asyncio.TaskGroup()` and :func:`asyncio.timeout()` context managers
now handle :exc:`~asyncio.CancelledError` subclasses as well as exact
:exc:`!CancelledError`.