import asyncio

from fastapi import FastAPI
import uvicorn


class FooClass:
    def __init__(self):
        self._foo_func_task: asyncio.Task = None

    async def start_foo_func(self):
        self._foo_func_task = asyncio.create_task(self.foo_func())

    async def foo_func(self):
        raise ValueError


app = FastAPI()


@app.on_event('startup')
async def startup_event():
    app.state.foo = FooClass()
    await app.state.foo.start_foo_func()


if __name__ == '__main__':
    uvicorn.run(app)

当我运行这段代码时,只有在脚本停止时才会显示ValueError,这不是很方便.是否有办法在异常引发时立即显示该异常?

推荐答案

一项任务一完成就做一件事(无论成功与否)就是asyncio.Task.add_done_callback的意思:

import asyncio

from fastapi import FastAPI
import uvicorn


class FooClass:
    def __init__(self):
        self._foo_func_task: asyncio.Task = None

    async def start_foo_func(self):
        self._foo_func_task = asyncio.create_task(self.foo_func())

        # here:
        self._foo_func_task.add_done_callback(
            lambda task: print(f"Exception: {type(task.exception())}")
        )

    async def foo_func(self):
        raise ValueError()


app = FastAPI()


@app.on_event("startup")
async def startup_event():
    app.state.foo = FooClass()
    await app.state.foo.start_foo_func()


if __name__ == "__main__":
    uvicorn.run(app)

Python-3.x相关问答推荐

如何在python中有效地使用多处理和pytube库来加快下载速度?

泛型类型的参数的静态类型

GUI 仍然有效并且没有错误消息时图形意外冻结 |具有多线程的 Pyside6 和 pyqtgraph (Python 3.11.4)

过滤列表中的所有字典以使用特定键并忽略其他键?

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

Python Regex 查找给定字符串是否遵循交替元音、辅音或辅音、元音的连续模式

过滤查询集和Q运算符的不同值

获取以特定字母开头的姓氏

如何在python中将列表转换为其他格式

python 3:如何判断一个对象是否是一个函数?

两个字符串之间的正则表达式匹配?

Pytorch 的随机 Select ?

如何注释一个以另一个函数作为参数的函数?

具有两个或多个返回参数的函数注释

django - 值更改后自动更新日期

如何使用 d.items() 更改 for 循环中的所有字典键?

根据条件过滤元组列表

如何使用 python 库连接到 poloniex.com websocket api

0 是 0 == 0(#evaluates 为真?)

如何从Pandas 中的字符串中提取前8个字符