全局异常处理器

全局异常处理器

在项目中我们往往不能全面的捕获抛出的异常,这就使得异常最终会上抛至框架,框架底层就会返回一个封装着错误信息的JSON格式的数据,但这样的数据通常并不是我们想要的。

我们希望能够对上抛的异常实现统一处理,进而返回我们希望的错误信息,这时候就可以借助Spring中提供的全局异常处理器进行处理,并最终返回我们希望的错误信息。

快速入门

  • 定义一个类,在类上添加@ControllerAdvice标明这是一个控制器通知类,并加上@ResponseBody标明这个类方法的返回值会转换为json后再响应给前端。
  • 在控制器通知类中,需要定义一个方法来捕获异常,并在这个方法上添加@ExceptionHandler声明这是个异常处理方法,通过@ExceptionHandler注解中的value属性指定要捕获哪一类异常,当然也可以在方法形参中声明要捕获的异常类型。
java 复制代码
//@RestControllerAdvice == @ControllerAdvice + @ResponseBody
@RestControllerAdvice//声明这是个通知器控制类
@Slf4j
public class GlobalExceptionAdvice {

    @ExceptionHandler//声明这是个异常处理方法
    public Result exceptionHandler(Exception e) {
        //方法形参声明捕获异常类型,也可以在注解value属性中声明
        log.error("[服务器异常] : {}" ,e.getMessage());
        return Result.error("服务器异常,请稍后重试...");
    }

    
    @ExceptionHandler//声明这是个异常处理方法
    public Result exceptionHandler(ArithmeticException e) {
        //方法形参声明捕获异常类型,也可以在注解value属性中声明
        log.error("[服务器异常] : {}" ,e.getMessage());
        return Result.error("服务器出现算数异常,请稍后重试...");
    }
        
}

当我们向上抛出不同异常并不catch时,异常最终会到达全局异常处理器,控制台结果如下:

  • throw new RuntimeException("hello RuntimeException...")
  • throw new ArithmeticException("hello ArithmeticException...")

当有多个异常处理方法时,抛出的异常匹配异常处理方法的顺序为当前异常自上一次匹配,如果当前异常没有对应异常处理方法,就会向上去找其父类的异常处理方法。

相关推荐
yaoxin5211231 天前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
何极光1 天前
IDEA集成Maven
java·maven·intellij-idea
程序员二叉1 天前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉1 天前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
老马识途2.01 天前
在AI的帮助下理解spring的启动过程
java·前端·spring
青山木1 天前
Hot 100 --- 轮转数组
java·数据结构·算法
Qt程序员1 天前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean1 天前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
大白菜和MySQL1 天前
java应用排查高线程
java·python
KobeSacre1 天前
ReentrantLock源码
java