summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio/tasks.py
diff options
context:
space:
mode:
authorromasku <romasku135@gmail.com>2020-05-15 20:12:05 (GMT)
committerGitHub <noreply@github.com>2020-05-15 20:12:05 (GMT)
commit382a5635bd10c237c3e23e346b21cde27e48d7fa (patch)
treeaeafbddb7b6a726cb148345269719c79043354d7 /Lib/asyncio/tasks.py
parentc087a268a4d4ead8ef2ca21e325423818729da89 (diff)
downloadcpython-382a5635bd10c237c3e23e346b21cde27e48d7fa.zip
cpython-382a5635bd10c237c3e23e346b21cde27e48d7fa.tar.gz
cpython-382a5635bd10c237c3e23e346b21cde27e48d7fa.tar.bz2
bpo-40607: Reraise exception during task cancelation in asyncio.wait_for() (GH-20054)
Currently, if asyncio.wait_for() timeout expires, it cancels inner future and then always raises TimeoutError. In case those future is task, it can handle cancelation mannually, and those process can lead to some other exception. Current implementation silently loses thoses exception. To resolve this, wait_for will check was the cancelation successfull or not. In case there was exception, wait_for will reraise it. Co-authored-by: Roman Skurikhin <roman.skurikhin@cruxlab.com>
Diffstat (limited to 'Lib/asyncio/tasks.py')
-rw-r--r--Lib/asyncio/tasks.py10
1 files changed, 9 insertions, 1 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 717837d..f5de1a2 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -496,7 +496,15 @@ async def wait_for(fut, timeout, *, loop=None):
# after wait_for() returns.
# See https://bugs.python.org/issue32751
await _cancel_and_wait(fut, loop=loop)
- raise exceptions.TimeoutError()
+ # In case task cancellation failed with some
+ # exception, we should re-raise it
+ # See https://bugs.python.org/issue40607
+ try:
+ fut.result()
+ except exceptions.CancelledError as exc:
+ raise exceptions.TimeoutError() from exc
+ else:
+ raise exceptions.TimeoutError()
finally:
timeout_handle.cancel()