43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
|
# In MicroPython, a non-awaited task with a pending exception will raise to
|
||
|
# the loop's exception handler the second time it is scheduled. This is
|
||
|
# because without reference counting we have no way to know when the task is
|
||
|
# truly "non awaited" -- i.e. we only know that it wasn't awaited in the time
|
||
|
# it took to be re-scheduled.
|
||
|
|
||
|
# If the task _is_ subsequently awaited, then the await should succeed without
|
||
|
# raising.
|
||
|
|
||
|
try:
|
||
|
import uasyncio as asyncio
|
||
|
except ImportError:
|
||
|
try:
|
||
|
import asyncio
|
||
|
except ImportError:
|
||
|
print("SKIP")
|
||
|
raise SystemExit
|
||
|
|
||
|
|
||
|
def custom_handler(loop, context):
|
||
|
print("exception handler", type(context["exception"]).__name__)
|
||
|
|
||
|
|
||
|
async def main():
|
||
|
loop = asyncio.get_event_loop()
|
||
|
loop.set_exception_handler(custom_handler)
|
||
|
|
||
|
async def task():
|
||
|
print("raise")
|
||
|
raise OSError
|
||
|
|
||
|
print("create")
|
||
|
t = asyncio.create_task(task())
|
||
|
print("sleep 1")
|
||
|
await asyncio.sleep(0)
|
||
|
print("sleep 2")
|
||
|
await asyncio.sleep(0)
|
||
|
print("await")
|
||
|
await t # should not raise.
|
||
|
|
||
|
|
||
|
asyncio.run(main())
|