Z次元
文章 笔记 日志
专题
专栏分类 文章归档
友链
友情链接 朋友圈
交流
留言 关于我
头像
系列文章
-
-
-
-
SpringBoot项目统一异常处理
系列文章
知识积累
最后更新:2024/12/15|创建时间:2022/4/20

SpringBoot项目统一异常处理,文章介绍了两种常见方式:使用AOP拦截器或注解。AOP方式通过切面类捕获处理异常,返回统一格式的错误信息。注解方式则声明全局异常处理类,针对不同异常类型定义处理方法,返回自定义的错误响应。文章强调了统一处理异常的重要性,以保持代码的整洁和异常信息的统一反馈。

前言

简单回顾下异常分类:

  1. 非受检异常:运行时异常
  2. 受检异常:编译时异常

异常的处理通常有两种方式:

  1. 第一种就是在当前类使用try-catch捕获异常并直接处理
  2. 另一种就是不在当前类处理,使用throws抛给上一级处理

如果在每个异常处都进行try-catch处理的话,无疑会造成代码的臃肿,且不够美观。
所以,一般来说除非的必须在在当前类处理的异常,否则都会向上抛出,直到抛到controller层为止,在controller层进行统一的异常处理(不处理的话,再往上抛就抛到前端去了)。

统一进行异常处理的常见方式有两种:1. 使用注解 或者 2. 使用(AOP)拦截器


controller类示例:

```java
@RestController
public class ErrorTestController {
    @Autowired
    ErrorService errorService;

    @GetMapping("/test")
    public ReturnResult toTest(){
        HashMap<String, String> map = new HashMap<>();
        map.put("data", "这里是返回的数据");
        return ReturnResult.success(map);
    }
    @GetMapping("/test1")
    public ReturnResult toTest1(){
        errorService.error1();
        return ReturnResult.success();
    }

    @GetMapping("/test2")
    public ReturnResult toTest2(){
        errorService.error2();
        return ReturnResult.success();
    }

}

同时在service类中模拟异常:

@Service
public class ErrorService {
    public void error1() throws NullPointerException {
        String[] str = null;
        String s = str[0];
    }

    public void error2() throws ArithmeticException {
        int i = 9 / 0;
    }
  
}

AOP处理异常

使用AOP切controller类,进行统一的异常处理。

AOP切面类:


import email.entity.ReturnResult;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;

@Aspect
@Component
public class AOPCatch {
    private final Logger logger = LoggerFactory.getLogger(AOPCatch.class);

    @Around("execution(public * email.controller.*.*(..))")
    public ReturnResult catchException(ProceedingJoinPoint joinPoint) {
        try {
            Object result = joinPoint.proceed();
            // 没有异常,直接将接收到的被切方法的返回值原样返回
            return (ReturnResult) result;
        } catch (Throwable e) {
            HashMap<String, String> map = new HashMap<>();
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            logger.error(className + ":" + methodName + ":" + e);
            map.put("data", className + ":" + methodName + ":" + e);
            ReturnResult error = ReturnResult.error(map);
            // 有异常,则返回错误信息
            return error;
        }
    }
}

图片

图片

注解处理异常

使用@ControllerAdvice或者@RestControllerAdvice(声明全局异常),然后配合@ExceptionHandler注解使用

@RestControllerAdvice注解就相当于@ControllerAdvice+@ResponseBody注解,标识该类中接收的返回信息的(json类型的)数据。

创建一个统一的异常处理类:

package email.servive;

import email.entity.ReturnResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;

@RestControllerAdvice
//@ControllerAdvice
//@ResponseBody
public class GlobalExceptionHandler {

    private final Logger logger = LoggerFactory.getLogger(AOPCatch.class);

    // 全局异常处理
    @ExceptionHandler(Exception.class)
    public ReturnResult error(Exception e){
        e.printStackTrace();
        logger.error(e.getMessage());
        return ReturnResult.error();
    }

    // 指定异常处理
    @ExceptionHandler(NullPointerException.class)
    public ReturnResult error(NullPointerException e){
        e.printStackTrace();
        logger.error(e.getMessage());

        HashMap<String, String> map = new HashMap<>();
        map.put("data", "空指针异常");
        return ReturnResult.error(map);
    }


// 自定义异常处理,针对于业务需求自定义的
/*
    @ExceptionHandler(MyException.class)
    public ReturnResult error(MyException e){
        e.printStackTrace();
        return ReturnResult.error();
    }
*/

}

图片

图片

图片

版权声明
本文依据 CC-BY-NC-SA 4.0 许可协议授权,请您在转载时注明文章来源为 Z次元 ,若本文涉及转载第三方内容,请您一同注明。
更多专栏文章推荐
知识积累
人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。
Java Stream流
2022/4/15
Axios携带数据发送请求及后端接收方式
2022/3/25
JDK新版特性(18-21)
2025/2/7
JDK新版特性(11-17)
2025/1/30
评论区
发表评论

这里还没有评论哦

快来发一条评论抢占前排吧

前言
AOP处理异常
注解处理异常
目录
前言
AOP处理异常
注解处理异常
十玖八柒
每天进步多一点
欢迎到访φ(゜▽゜*)♪
最新评论
永恒末匕:

好哇塞,这个厉害

十玖八柒:

测试图片发送

Corwin: @十玖八柒

哎 主要是我的个人网站用的是静态的cos 实现评论框还是有点困难

十玖八柒: @Corwin

评论模块是自己写的,富文本编辑器是封装的Tiptap(这个编辑器非常强大,你可以去看下)

我的
个人主页
站点地图
RSS订阅
导航
十年之约
虫洞穿梭
全站友链
虚位以待
©2020 - 2025 By 十玖八柒 版权所有
豫ICP备20021466号