异常统一管理器

1.异常谁处理?

不应该把异常抛给调用方(用户)、对应的前端,弊端:

  • ×可能暴露内部的处理逻辑
  • ×调用方不会处理异常

catch自己的异常:

  • 成功进入方法体:×每一个controller类都手动做一个catch,处理繁琐!

  • 进不了方法体:×捕获不到!
    异常统一管理:

  • 不应该把所有异常都catch,而是都打印到日志里(后端会自己打出,前端需要设置)

  • 不用每个都写catch

  • 能拦截所有想拦截的异常

2. 异常发生2类情况(客户端/服务端)

2.1 客户端

2.1.1 客户端:正常传参

正常传参–进入controller类的方法体中,方法中逻辑返回JsonResponse(4种状态)

  • 背景:

后端 返回给 前端 数据类型不一:boolean、集合等 ==》后端 向前端返回数据 必须统一:返回值(状态码,信息(状态码辅助解释),真正返回数据值(泛型))

  • 状态码(针对前端发来的参数)
SUCCESS(200,"请求成功"),
    ERROR(500,"请求失败"),
    AUTH(401,"用户未登录或登陆超时"),
    PERMISSION(403,"无此操作权限");

2.1.2 客户端:传参异常 —不进入方法体

  • 服务端无法捕获异常对象,因此也不能给调用方法的用户一个处理(=告诉调用人属于什么错误,怎么处理)后的反馈。
  • 用户:傻傻等。后端:给不了。无解

2.2 服务端(运行异常)

后端代码在运行时错误=服务端错误。

  • 发生错误后没有被后端处理就直接报给前端控制台。
  • 前端没有收到【展示到页面上的】反聩=没有错因提示页面(控制台有)

在这里插入图片描述
点击地址详情:
在这里插入图片描述

3. 前端必展现,处理后的异常提示----请求有反馈

只要有异常,无论前端传来参数异常(客户端异常),或者单纯后端异常(服务器异常)。后端都必须给前端【页面】展示出异常提示页面

4. springboot的controller类方法异常统一处理

4.1 @RestControllerAdvice+@ExceptionHandler

  • advice:切面

4.1.1 @RestControllerAdvice属性—指定包(范围)

缩小拦截controller类的范围(只拦截自己写的类)

@RestControllerAdvice("com.cindy")
public class DefaultException {}

4.1.2 @ExceptionHandler属性----指定异常类型

  • @ExceptionHandler(BusinessException.class)若指定:只拦截BusinessException这种异常类型
  • @ExceptionHandler 若不指定:以标签下的方法的参数为准(传什么异常,拦截什么)
 @ExceptionHandler(BusinessException.class)
    ResultJson defaultExceptionHandler(BusinessException exception){}

4.1.3 拦截优先级 ----最小范围(子类)

报错提示:满足的最小范围(子类)的异常,与顺序无关

4.1.4 拦截所有

注意:不应该把所有异常都catch,而是都打印到日志里。有选择性catch。

@RestControllerAdvice   --------包不指定
public class DefaultException {
   @ExceptionHandler   
    ResultJson defaultExceptionHandler(Exception exception){
                          --------最大的异常类型Exception
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 FastAPI 中,可以通过使用异常处理器(Exception Handlers)来统一管理所有异常返回状态。异常处理器是一种在应用程序中捕获和处理异常的机制,它可以捕获所有未处理的异常并返回自定义的响应。 可以通过使用 FastAPI 中的 `ExceptionMiddleware` 中间件来添加异常处理器。`ExceptionMiddleware` 中间件会在请求处理过程中捕获所有未处理的异常,并将其转换为自定义响应。 以下是一个使用 `ExceptionMiddleware` 中间件来统一管理所有异常返回状态的示例: ```python from fastapi import FastAPI, HTTPException from fastapi.middleware import Middleware from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from starlette.exceptions import HTTPException as StarletteHTTPException app = FastAPI() # 添加 CORS 中间件 middleware = [ Middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"]), ] # 添加异常处理器 @app.exception_handler(Exception) async def exception_handler(request, exc): if isinstance(exc, HTTPException): return JSONResponse(status_code=exc.status_code, content={"message": exc.detail}) elif isinstance(exc, StarletteHTTPException): return JSONResponse(status_code=exc.status_code, content={"message": exc.detail}) else: return JSONResponse(status_code=500, content={"message": "Internal Server Error"}) # 添加路由 @app.get("/") async def root(): return {"message": "Hello World"} # 运行应用程序 if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` 在上面的示例中,我们添加了一个名为 `exception_handler` 的异常处理器,并使用 `JSONResponse` 来返回自定义的响应。在异常处理器中,我们检查异常类型并返回相应的响应。如果异常是 `HTTPException` 类型或 `StarletteHTTPException` 类型,则返回异常的详细信息。否则,返回一个 500 错误和一个默认的错误消息。 通过使用 `ExceptionMiddleware` 中间件和异常处理器,我们可以轻松地统一管理所有异常返回状态,并提供自定义的错误响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值