装饰器版本自定义异常

1.首先我们定义三个文件,分别为exception.py,main.py, user.py

2.自定义异常需要继承HTTPException,该异常可以从fastapi中直接导入
from fastapi import HTTPException 3.exception.py中定义我们业务模块的异常
from fastapi import HTTPException class UserDoesNotExistsException(HTTPException):
def __init__(self, detail: str, status_code: int):
self.detail = detail
self.status_code = status_code 4. user.py文件
router_user = APIRouter(prefix='/user', tags=['用户模块'])
@router_user.get('/{user_id}')
async def get_id_by_user(user_id: int):
if user_id != 1:
raise UserDoesNotExistsException(status_code=400, detail="id not exists")
return {"user_id": user_id} 5.main.py文件
from fastapi import FastAPI
from exception import UserDoesNotExistsException
from user import router_user app = FastAPI(debug=True) # 这里就是添加使用我们自定义的错误处理
@app.exception_handler(UserDoesNotExistsException)
def user_exception_handler(req: Request, ex: UserDoesNotException):
return JSONResponse(
status_code=ex.status_code,
content={"message": f'error: {ex.detail}'}
) app.include_router(router_user, prefix='/api/v1')

非装饰器版

第一种,通过在FastAPI()中指定exception_handlers

from fastapi import FastAPI
from fastapi.responses import JSONResponse async def exception_not_found(request, exc):
return JSONResponse({
'code':exc.status_code,
'error':'not found',
status_code=exc.status_code
}) exception_handlers = {
# 键值对的形式,写具体的状态码或者具体的Exception子类都可以,后面完整例子中有
404: exception_not_found,
} app = FastAPI(exception_handlers=exception_handlers)

第二种,通过实例化的FastAPI对象的add_exception_handler方法

from fastapi import FastAPI
from fastapi.responses import JSONResponse async def exception_not_found(request, exc):
return JSONResponse({
'code':exc.status_code,
'error':'not found',
status_code=exc.status_code
}) app = FastAPI()
# 同理,可以写具体的状态码或者具体的Exception子类都可以
app.add_exception_handler(404, exception_not_found)

完整案例,项目中可以使用

1.定义四个文件,exception.py(全局处理), main.py(主程序文件), user/user.py(业务模块), user/exception.py(用户模块自己的错误处理)

2.exception.py文件
from fastapi import HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse # 全局异常
async def global_exception_handler(request, exc):
if exc.status_code == 500:
err_msg = 'Server Internal Error'
else:
err_msg = exc.detail
return JSONResponse({
'code': exc.status_code,
'err_msg': err_msg,
'status': 'Failed'
}) # 请求数据无效时的错误处理
"""
example: http://127.0.0.1/user/{user_id}
success: http://127.0.0.1/user/1
failed: http://127.0.0.1/user/d
"""
async def validate_exception_handler(request, exc):
err = exc.errors()[0]
return JSONResponse({
'code': 400,
'err_msg': err['msg'],
'status': 'Failed'
}) golbal_exception_handlers = {
HTTPException: global_exception_handler,
RequestValidationError: validate_exception_handler
} class BaseAPIException(HTTPException):
status_code = 400
detail = 'api error'
def __init__(self, detail: str = None, status_code: int = None):
self.detail = detail or self.detail
self.status_code = status_code or self.status_code 3.定义user/exception.py
from exception import BaseAPIException class UserDoesNotExistsException(BaseAPIException):
status_code = 10000
detail = 'user does not exists' 4.定义uers/user.py
from fastapi.routing import APIRouter from .exception import UserDoesNotExistsException router_user = APIRouter(prefix='/user', tags=['用户模块']) @router_user.get("/{user_id}")
async def get_id_by_user(user_id: int):
if user_id != 1:
# 这里使用我们自定义的用户错误处理
# 返回的统一响应格式{"code":10000,"err_msg":"user does not exists","status":"Failed"}
raise UserDoesNotExistsException
return {"user_id": user_id} 5.定义main.py
from fastapi import FastAPI
from exception import golbal_exception_handlers
from user.user import router_user app = FastAPI(debug=True, exception_handlers=golbal_exception_handlers) app.include_router(router_user, prefix='/api/v1') if __name__ == '__main__':
import uvicorn
uvicorn.run(app='main:app', host='0.0.0.0', port=9002, reload=True) 6.响应
# example: http://127.0.0.1:9002/api/v1/user/2
{"code":10000,"err_msg":"user does not exists","status":"Failed"}
# example: http://127.0.0.1:9002/api/v1/user/d
{"code":400,"err_msg":"value is not a valid integer","status":"Failed"}

FastAPI中全局异常处理的更多相关文章

  1. ASP.NET MVC中全局异常处理

    以前不知道从哪里找到的处理全局异常的,觉得蛮好用就记下来了. 1, 建立MyExecptionAttribute.cs类,写入如下代码: using System; using System.Coll ...

  2. ASP.NET Core 中间件自定义全局异常处理

    目录 背景 ASP.NET Core过滤器(Filter) ASP.NET Core 中间件(Middleware) 自定义全局异常处理 .Net Core中使用ExceptionFilter .Ne ...

  3. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  4. Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)

    目前,在Web API中没有简单的方法来记录或处理全局异常(webapi1中).一些未处理的异常可以通过exception filters进行处理,但是有许多情况exception filters无法 ...

  5. Springboot集成Common模块中的的全局异常处理遇见的问题

    由于项目公共代码需要提取一个common模块,例如对于项目的文件上传,异常处理等,本次集成common代码时候maven引入common的全局异常处理代码之后发现不生效,由于common包路径与自己的 ...

  6. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

  7. WEB 项目中的全局异常处理

    在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...

  8. Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。

    通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法: controller中加入@Valid注解: @Req ...

  9. SpringBoot中的全局异常处理

    SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...

  10. springboot中 简单的SpringMvc全局异常处理

    1.全局异常处理类:GlobalExceptionHandler.java package com.lf.exception; import java.util.HashMap; import jav ...

随机推荐

  1. [转帖]Jmeter学习笔记(十七)——jmeter目录结构

      原文链接:http://www.cnblogs.com/zichuan/p/6938772.html 一.bin目录examples:  目录中有CSV样例 jmeter.bat  windows ...

  2. [转帖]Linux Page cache和Buffer cache

    https://www.cnblogs.com/hongdada/p/16926655.html free 命令常用参数 free 命令用来查看内存使用状况,常用参数如下: -h human-read ...

  3. 是否开启超线程对CPU不同命令的影响情况

    背景 最近公司购买了一台服务器, 要进行一次性能测试. 基于此, 我这边进行了一下超线程与否的测试验证 使用stress-ng的命令,对所有的 CPU 方法进行测试 然后只分析 bogo ops/s ...

  4. 【转】Java类加载器:类加载原理解析

    [转]Java类加载器:类加载原理解析 https://www.jianshu.com/p/1f704ad4196e 摘要: 每个开发人员对java.lang.ClassNotFoundExcetpi ...

  5. 基于华为fusionstorage的块存储CSI

    承接上文,块存储的CSI要比对象存储复杂一些,但总的处理逻辑还是一致的.下面以华为fusionstorage的CSI为例进行介绍,该插件支持了多个后端存储,如fusionstorage和oceanst ...

  6. 我在京东做研发 | 揭秘支撑京东万人规模技术人员协作的行云DevOps平台

    随着业务变化的速度越来越快各类IT系统的建设也越来越复杂大规模研发团队的管理问题日益突出如何提升研发效能成为时下各类技术团队面临的重要挑战 京东云DevOps专家将带您深入研发一线揭秘支撑京东集团万人 ...

  7. 自动部署(apb docker cicd gitlab)

    1.安装gitlab-runner docker pull gitlab/gitlab-runner:latest 2.运行镜像 docker run -d --name gitlab-runner ...

  8. x86 x64 arm64的区别

    我们常说的高通 865,麒麟990 不是 CPU 是 SoC(System On Chip),SoC 除了 CPU 外,还有 GPU,还有可选的浮点数加速器,专用于深度模型的加速器,等等.除此以外,S ...

  9. IDM(最佳的Windows下载工具)

    如果你是一名互联网"老司机",那么一定听过「IDM」这款下载工具的大名!它的全名叫做 Internet Download Manager (互联网下载管理器),缩写就是 IDM. ...

  10. nodejs连接mysql报错:throw err; // Rethrow non-MySQL errors TypeError: Cannot read property 'query' of undefined

    该问题的解决方案如下: win+R 输入cmd mysql -u root -p 输入密码进入到mysql 3.执行sql语句,将密码改成123456(自己可以记住的密码即可) alter user ...