Closed
Description
Bug report
Bug description:
import asyncio import threading import traceback async def raiseme(): raise ValueError(42) async def raiseme2(): raise asyncio.TimeoutError() loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) thr = threading.Thread(target=loop.run_forever, daemon=True) thr.start() print('raiseme() run_coroutine_threadsafe') try: task = asyncio.run_coroutine_threadsafe(raiseme(), loop) task.result() except: traceback.print_exc() print('raiseme2() run_coroutine_threadsafe') try: task = asyncio.run_coroutine_threadsafe(raiseme2(), loop) task.result() except: traceback.print_exc()
raiseme() run_coroutine_threadsafe Traceback (most recent call last): File "g:\Projects\NowPlaying\test.py", line 18, in <module> task.result() File "C:\Program Files\Python312\Lib\concurrent\futures\_base.py", line 456, in result return self.__get_result() ^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\Python312\Lib\concurrent\futures\_base.py", line 401, in __get_result raise self._exception File "g:\Projects\NowPlaying\test.py", line 6, in raiseme raise ValueError(42) ValueError: 42 raiseme2() run_coroutine_threadsafe Traceback (most recent call last): File "g:\Projects\NowPlaying\test.py", line 25, in <module> task.result() File "C:\Program Files\Python312\Lib\concurrent\futures\_base.py", line 456, in result return self.__get_result() ^^^^^^^^^^^^^^^^^^^ File "C:\Program Files\Python312\Lib\concurrent\futures\_base.py", line 401, in __get_result raise self._exception TimeoutError
The traceback of the second exception (TimeoutError
) is dropeed.
The reason is that _convert_future_exc
drops the origin exception's traceback:
cpython/Lib/asyncio/futures.py
Lines 316 to 325 in 812245e
To fix it, construct the new exception with the original traceback like that:
return exceptions.CancelledError(*exc.args).with_traceback(exc.__traceback__)
CPython versions tested on:
3.10, CPython main branch
Operating systems tested on:
Linux, Windows