Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
Closed
Description
Bug report
Bug description:
importasyncioimportthreadingimporttracebackasyncdefraiseme():raiseValueError(42)asyncdefraiseme2():raiseasyncio.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_threadsafeTraceback (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: 42raiseme2() run_coroutine_threadsafeTraceback (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._exceptionTimeoutErrorThe 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 in812245e
| def_convert_future_exc(exc): | |
| exc_class=type(exc) | |
| ifexc_classisconcurrent.futures.CancelledError: | |
| returnexceptions.CancelledError(*exc.args) | |
| elifexc_classisconcurrent.futures.TimeoutError: | |
| returnexceptions.TimeoutError(*exc.args) | |
| elifexc_classisconcurrent.futures.InvalidStateError: | |
| returnexceptions.InvalidStateError(*exc.args) | |
| else: | |
| returnexc |
To fix it, construct the new exception with the original traceback like that:
returnexceptions.CancelledError(*exc.args).with_traceback(exc.__traceback__)
CPython versions tested on:
3.10, CPython main branch
Operating systems tested on:
Linux, Windows