【FastAPI】错误 & 异常 响应处理 和 自定义错误 & 异常 处理

错误处理

只需要使用 raise 关键字 就可以返回错误响应

触发 HTTPException 异常响应

import uvicorn
from fastapi import FastAPI
from fastapi.exceptions import HTTPException

app = FastAPI()

@app.get('/http_exception')
def exception(city: str):
    if city != 'cd':
        raise HTTPException(
            detail='city is not cd',  # 错误响应内容
            headers={'city_error': 'city is not cd'},  # 发生错误添加的头部信息
            status_code=420)  # 自定义响应码
    return {'city': 'cd'}

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

mark

重写错误响应

准确一点是 对相应的错误进行拦截 修改,并不是重写

重写 HTTPException 异常响应

from fastapi.exceptions import HTTPException
# from starlette.exceptions import HTTPException as StarletteHTTPException # 与上面一排一样

app = FastAPI()

# 在异常中间件 拦截,相当于 重写
@app.exception_handler(HTTPException)
async def http_exception_v1(request: Request, exc: HTTPException):
    """
    # 改变成字符串响应
    :param request: 不可省略
    :param exc: HTTPException
    :return:
    """
    return PlainTextResponse(str(exc.detail), status_code=400)

mark

重写 RequestValidationError 参数验证错误响应

from fastapi.exceptions import RequestValidationError

# 在异常中间件 拦截 RequestValidationError 进行操作
@app.exception_handler(RequestValidationError)
async def request_validation_error_v1(request: Request, exc: RequestValidationError):
    """
    # 改变成字符串响应
    :param request: 不可省略
    :param exc: RequestValidationError
    :return:
    """
    print(exc)
    return PlainTextResponse(str(exc.errors()), status_code=500)

mark

自写错误处理类

当提供的两种不够用的时候(HTTPExceptionRequestValidationError),可以自己写

import uvicorn
from fastapi import FastAPI
from fastapi.requests import Request
from starlette.responses import PlainTextResponse

app = FastAPI()

# 自定义错误类 继承 Exception 类
class UnicornException(Exception):
    def __init__(self, error_city: str, status_code: int):
        self.error_city = error_city
        self.status_code = status_code

# 异常中间件 拦截自定义的异常
@app.exception_handler(UnicornException)
async def request_validation_error_v1(request: Request, exc: UnicornException):
    """
    # 改变成字符串响应
    :param request: 不可省略
    :param exc: UnicornException
    :return:
    """
    print(exc)
    return PlainTextResponse(str(exc.error_city), status_code=exc.status_code)

@app.get('/validation')
def validation(city: int):
    if city != 111
        # 触发 自定义异常
        raise UnicornException(
            error_city='city is not 111',  # 错误响应内容
            status_code=420)  # 自定义响应码
    return {'city': city}

if __name__ == '__main__':
    uvicorn.run(app)
发表评论 / Comment

用心评论~