我的任务是调试一个API.它的一个终结点处理创建和更新一些资源,如果资源无法正确更新,我想引发一个适当的异常.我收到了一个如下所示的函数:

from fastapi import APIRouter, HTTPException
router = APIRouter()

@router.post("/")
async def create_resource(body:dict) -> dict:
    try:
        ...
    except Exception as e:
        raise HTTPException(status_code=404, detail="data not found")

函数内部可能出现的一个错误最好用409 response来解释,因此我添加了如下所示的异常:

@router.post("/")
async def create_resource(body:dict) -> dict:
    try:
        ...

        if bad_condition:
            raise HTTPException(status_code=409, detail="data points already exist")

    except Exception as e:
        raise HTTPException(status_code=404, detail="data not found")

据我所知,宽泛的try/except条款抓住了我的错误,无论如何都提高了404 response分.我希望能够在不过多修改函数的情况下引发409错误,而不是通用的404错误.在不重构函数本身的情况下引发此错误的最干净方法是什么?

推荐答案

在Pythonyou can specify multiple except blocks中,第一个匹配的将执行其中之一.因此,您可以except然后重新raise所有HTTPException,以避免将它们替换为404

@router.post("/")
async def create_resource(body:dict) -> dict:
    try:
        ...

        if bad_condition:
            raise HTTPException(status_code=409, detail="data points already exist")
    except HTTPException as e:
        raise e
    except Exception as e:
        raise HTTPException(status_code=404, detail="data not found")

这将意味着,如果你有任何HTTPException,他们仍然会被提高,但任何其他将被404 HTTPException取代.

Python-3.x相关问答推荐

一种基于绝对排序值的极框索引和列定位的Python方法

从.csv导入将文件夹路径加入到文件名

删除浮点型数据集中每列重复值比例超过一定阈值的列

命名空间前缀无效

如何提高 snowpark 程序的性能?

需要找到完全匹配并使用正则表达式替换

仅当从 USB 摄像头接收到新图像时才处理图像

DynamoDB - boto3 - batch_write_item:提供的关键元素与架构不匹配

列出相同索引的Pandas

合并问卷中多列中的稀疏问题 - Pandas

pymongo 失败并出现错误未定义

将字节数组转换为类似字节的对象?

无法在 macOS 上的 Anaconda3 python3.6 上安装 OpenCV3

Python:如何判断一个项目是否被添加到一个集合中,没有 2x(hash,lookup)

如何使 Python3 成为 Geany 中的默认 Python

Asyncio RuntimeError:事件循环已关闭

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)

Pruning in Keras

计算两个文件的行差异的最有效方法是什么?

将 numpy.float64 列表快速转换为 Python 中的浮点数