Message406957
I found a case where an exception is lost if the loop is stopped in a `finally`.
```
import asyncio
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
async def method_that_raises():
loop = asyncio.get_event_loop()
try:
logger.info("raising exception")
raise ValueError("my exception1")
# except Exception as e:
# logger.info("in catcher")
# logger.exception(e)
# raise
finally:
logger.info("stopped")
loop.stop()
# await asyncio.sleep(0.5)
return
async def another_level():
try:
await method_that_raises()
except Exception as e:
logger.info("trapping from another_level")
logger.exception(e)
if __name__ == "__main__":
logger.info("start")
try:
asyncio.run(another_level())
except Exception as e:
logger.exception(e)
logger.info("done")
```
gives this output in python 3.10.0 and 3.8.10 (tested in Ubuntu Windows Subsystem Linux) and 3.8.11 in Windows:
```
INFO:root:start
DEBUG:asyncio:Using selector: EpollSelector
INFO:root:raising exception
INFO:root:stopped
INFO:root:done
```
i.e., no evidence an exception was raised (other than the log message included to prove one was raised)
If I remove the `return`, then the exception propagates as expected.
I believe the exception should be propagated regardless of whether there's a `return` in the `finally` block. |
|
Date |
User |
Action |
Args |
2021-11-24 20:35:15 | Amos.Anderson | set | recipients:
+ Amos.Anderson, asvetlov, yselivanov |
2021-11-24 20:35:15 | Amos.Anderson | set | messageid: <1637786115.42.0.981078468976.issue45894@roundup.psfhosted.org> |
2021-11-24 20:35:15 | Amos.Anderson | link | issue45894 messages |
2021-11-24 20:35:15 | Amos.Anderson | create | |
|