当前位置: 首页 > news >正文

Springboot中的异常处理

@ControllerAdvice虽然只是在处理@Controller注解的类,在@Service层抛出的异常如果没有在@Service层被处理的话,会向上抛出到到@Controller层,再被异常处理器捕获

1. 全局异常处理

@ControllerAdvice:全局处理器,处理有@Controller注解的类,这里是处理了异常,还可以处理别的东西
@RestControllerAdvice@ControllerAdvice + @ResponseBody
@ExceptionHandler:异常处理器,它的参数可以指定具体的异常类型

import com.example.common.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice   // 注解的作用:应用与所有@Controller注解的类,并结合了@ResponseBody
public class GlobalExceptionHandler {

    // 处理全局异常
    @ExceptionHandler   // 处理什么异常取决与此注解的value,此处是处理所有异常
    public Result<String> handler(Exception e){ // 参数是异常的类型
        return Result.error("500","服务器异常");	// 直接返回给前端
    }
}

2. 处理主动抛出的自定义异常

  • 自定义异常类
import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
// 自定义异常,继承RuntimeException,表示这是一个运行时异常,需要在代码中手动抛出
public class CustomException extends RuntimeException{
    private String msg;
}
  • 处理自定义异常
@RestControllerAdvice   
public class GlobalExceptionHandler {
    // 处理自定义异常
    @ExceptionHandler(CustomException.class)    // 指定处理的异常类型为CustomException
    public Result<String> handler(CustomException e){
        return Result.error("100",e.getMsg());	// 直接返回给前端
    }
}
  • 如何抛出自定义异常
throw new CustomException("自定义异常");

3. 异常处理的完整代码(方便拷贝)

import com.example.common.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice   // 注解的作用:应用与所有@Controller注解的类,并结合了@ResponseBody
public class GlobalExceptionHandler {

    // 处理全局异常
    @ExceptionHandler   // 处理异常,处理什么异常取决与此注解的value,此处是处理所有异常
    public Result<String> handler(Exception e){ // 参数是异常的类型
        return Result.error("500","服务器异常");
    }
    // 处理自定义异常
    @ExceptionHandler(CustomException.class)    // 处理自定义异常
    public Result<String> handler(CustomException e){
        return Result.error("100",e.getMsg());
    }
}

4. 自定义sql异常处理(方便拷贝)

    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
        log.error("异常信息:{}", ex.getMessage());
        String message = ex.getMessage();  // Duplicate entry 'lisi' for key 'employee.idx_username'
        // 从异常信息中分析具体错误原因
        if (message.contains("Duplicate entry")){
            String[] split = message.split(" ");
            String username = split[2];
            return Result.error(username + MessageConstant.ALREADY_EXISTS);
        }
        return Result.error(MessageConstant.UNKNOWN_ERROR);
    }

5. 代码中用到的Result类

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Result<T> {
    private String code;  // 代码
    private String msg; // 信息
    private T data; // 数据

    public static <T> Result<T> ok(){
        return new Result<T>("1", "success", null);
    }

    public static <T> Result<T> ok(T data){
        return new Result<>("1", "success", data);
    }

    public static <T> Result<T> error(String msg){
        return new Result<T>("0", msg, null);
    }

    public static <T> Result<T> error(String code, String message){
        return new Result<>(code, message, null);
    }
}

相关文章:

  • 棒球和垒球区别·棒球1号位
  • Marp 高效 Markdown 幻灯片制作指南
  • 爱普生车规级晶振SG2520CAA智能汽车电子系统的应用
  • Java Stream API 的使用
  • vulnhub靶场之healthcare靶机
  • IROS论文分享:动态场景双向树规划算法RT-RRT
  • 端口转发、隧道与Pivoting技术详解及区别解析
  • uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)
  • 计算机网络——DNS
  • Java入职篇(1)——心态篇
  • CBNet:一种用于目标检测的复合骨干网架构之论文阅读
  • OpenEuler-22.03-LTS上利用Ansible轻松部署MySQL 5.7
  • 【HeadFirst系列之HeadFirstJava】第19天之深入理解访问者模式:解耦对象结构与操作的优雅设计
  • YOLOv4:目标检测的卓越进展
  • 大数据学习(68)- Flink和Spark Streaming
  • pom.xml中配置的repository,在编译器下载依赖包没生效,怎么解决
  • Springer独立出版 | 2025年第二届计算语言学与自然语言处理国际会议(CLNLP 2025)
  • 登录认证-登录校验-Filter
  • 凸优化算法学习笔记:决策单调性与 wqs二分
  • [新能源]新能源汽车快充与慢充说明
  • 凤阳鼓楼脱落瓦片2023年刚经历修复,凤阳县文旅局长回应是否违建等焦点问题
  • 上影节官方海报公布:电影之城,每一帧都是生活
  • 照护者说|胡泳:向死而在,爱这个世界
  • MiniMax发布新一代语音大模型
  • 国家统计局答澎湃:我国投资的潜力依然巨大,支撑投资增长的有利因素仍然比较多
  • 当智慧农场遇见绿色工厂:百事如何用科技留住春天的味道?