SpringBoot - 全局异常处理

如果没有处理异常,异常信息就会层层递进:mapper => service => controller => 框架
最终报错:

处理方案:

  • controller 层每个映射进行 try/catch 处理:比较臃肿且繁琐
  • Spring 全局异常处理器
    • @RestControllerAdvice: RestController + @ResponseBody
    • @ExceptionHandler(异常类对象)

案例1:捕获最大的异常,打印异常后将异常信息返回统一结果给前端

package com.chuangzhou.exception;


import com.chuangzhou.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

//@RestControllerAdvice
public class GlobalExceptionHandler {


    @ExceptionHandler(Exception.class)
    public Result gloHanlder(Exception e){
        e.printStackTrace();
        return Result.error(e.getMessage());
    }
}

如下,不推荐这种处理方案,用户会接收到一大堆看不懂的信息,最终还是不知道什么原因

案例2:捕获具体异常,返回给用户简明易懂的报错原因

package com.chuangzhou.exception;


import com.chuangzhou.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public Result hanlder(Exception e){
        String message = e.getMessage();
        if (message.contains("就业部")){
            return Result.error("就业部已经存在不可以重复添加");
        }
        return Result.error("添加失败");
    }

}

效果:

最后如果全局异常处理类中存在多个异常会优先进入到异常父类当中

posted @ 2023-08-26 16:18  chuangzhou  阅读(77)  评论(0编辑  收藏  举报