Ладно, это очень странно, но вот...
import asyncio
from starlette.applications import Starlette
class MyTasks:
def __init__(self):
self.task = None
async def main(self):
self.task = asyncio.create_task(self.hello())
async def hello(self):
raise ValueError
async def main():
await MyTasks().main()
app = Starlette(on_startup=[main])
$ uvicorn test:app
INFO: Started server process [26622]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Хм, нет ValueError
здесь...
Теперь удалите назначение self.task
в MyTasks.main()
.
async def main(self):
asyncio.create_task(self.hello())
...
$ uvicorn test:app
INFO: Started server process [29083]
INFO: Waiting for application startup.
ERROR: Task exception was never retrieved
future: <Task finished name='Task-3' coro=<MyTasks.hello() done, defined at ./test.py:13> exception=ValueError()>
Traceback (most recent call last):
File "./test.py", line 14, in hello
raise ValueError
ValueError
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
... И вуаля.
Что тут происходит? Как это назначение создает или прерывает регистрацию исключений!?