装饰器版本自定义异常

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. 华城金锐申威SW64服务器重装过程

    华城金锐申威SW64服务器重装过程 背景 这边为了进行兼容性验证新进了两套申威的服务器. 一台机器带着安装好的操作系统了. 但是另外一套没有对应的系统. 端午期间想着趁着上班的人少, 加吧给处理一下. ...

  2. [转帖]Sar的一次使用案例

    https://www.jianshu.com/p/b93342d43e13 问题现象 有一台机器,在某个时间点OS类似无响应,造成使用者感觉在该时间点机器应该发生重启,就此问题进行分析. 日志查看 ...

  3. 关于async函数的错误处理

    1. 关于async函数的错误处理 有些时候,我们请求的接口可能会报错: 从而导致后面的代码无法去执行: 这样就会造成页面上某些状态出错! 那么怎么样才能 既能捕获到错误 还能让代码往后面执行呢 2. ...

  4. JS中typeof和instanceof的区别

    01==> 浅谈JS中的typeof和instanceof的区别 // JS中的typeof和instanceof常用来变量是什么类型. // typeof一般返回以下几个字符串: // Str ...

  5. 【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  6. pycharm像vs那样进行代码折叠

    在visual studio中可以使用#region和#endregion来进行代码折叠,我尝试在pycharm中也可以使用相同的指令来折叠代码. 但是如果#endregion是在方法的最后面或者类的 ...

  7. C/C++ 关于运算符重载笔记

    加号运算符重载: 重载加号运算符,让 p3 = p1 + p2 改成 p3.mage = p1.mage + p2.mage 实现两个数据成员的相加. 告诉编译器,两个类中的数据成员应该怎么相加. 成 ...

  8. Windows 10 ISO原版镜像文件下载(2024年01月)

    Windows 10 (business editions), version 22H2 (x64) - DVD (Chinese-Simplified) 链接:https://pan.baidu.c ...

  9. 深入剖析Java中的反射,由浅入深,层层剥离!

    写在开头 之前更新了不少Java的基础知识,比如Java的类.对象.基础类型.关键字.序列化.泛型.值传递等等,今天要上点深度了,来聊一聊Java中的 反射 ! 所谓反射,就是在运行时分析.检查和操作 ...

  10. mit6.824lab2D-Debug记录

    1.死锁 要提交快照的时候由于没有人取走applyCh通道里面的东西,导致死锁. 具体解释: 2D的测试代码中在日志达到一定大小时会调用snapshot,该函数需要申请rf.mu这个互斥锁.而在提交普 ...