第14节,FastAPI 处理异常

1. HTTPException

FastAPI 使用HTTPException 来处理请求异常,当客户端请求的资源不存在或者请求的数据存在问题时,可以通过抛出HTTPException异常的方式来响应请求,下面的例子里,如果客户端向获取uid为3的用户信息,服务就会返回404错误

from fastapi import FastAPI, HTTPException

app = FastAPI()


@app.get('/users/{uid}')
def get_user(uid: int):
    if uid == 3:
        raise HTTPException(status_code=404, detail='用户不存在')

    return {"uid": uid}

在浏览器里访问 http://127.0.0.1:8000/users/3 ,得到的响应结果是

{"detail":"用户不存在"}

看一下HTTPException 的定义

class HTTPException(StarletteHTTPException):
    def __init__(
        self,
        status_code: int,
        detail: Any = None,
        headers: Optional[Dict[str, Any]] = None,
    ) -> None:
        super().__init__(status_code=status_code, detail=detail)
        self.headers = headers

HTTPException 可以定义返回的状态码,错误说明,并且可以设置headers,通过HTTPException处理异常虽然简单,但是我们对返回数据内容的控制能力很弱,而且如果有大量的这种处理,也会导致代码变得混乱,为此,FastAPI 还允许你自定义异常处理器。

2. 自定义异常处理器

from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse

app = FastAPI()


class UserNotExistException(Exception):
    def __init__(self, uid: int):
        self.uid = uid


@app.exception_handler(UserNotExistException)
def user_not_exist_exception_handler(request: Request, exc: UserNotExistException):
    data = {
        'status': 1,
        'msg': f'user {exc.uid} is not exist'
    }

    return JSONResponse(content=data)


@app.get('/users/{uid}')
def get_user(uid: int):
    if uid == 3:
        raise UserNotExistException(uid=uid)

    return {"uid": uid}

第一步,定义一个异常,继承Exception
第二步,使用exception_handler装饰器定义处理异常的函数
第三步,遇到异常时抛出异常

通过自定义异常,我们可以自定义返回的数据内容,更加自由灵活,在处理异常的函数里,也可以针对异常做一些处理工作,同样的请求,得到的响应结果是

{"status":1,"msg":"user 3 is not exist"}

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案