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