当前位置: 首页 > 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);
    }
}
http://www.dtcms.com/a/68707.html

相关文章:

  • 棒球和垒球区别·棒球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二分
  • [新能源]新能源汽车快充与慢充说明
  • 【赵渝强老师】达梦数据库的目录结构
  • [笔记] 深入指南:使用 OpenManus 本地部署使用指南.
  • 生成式人工智能对芯片设计EDA行业的影响分析
  • 嵌入式硬件--开发工具-AD使用常用操作
  • install of jenkins-2.501-1.1.noarch conflicts with file
  • Linux ECM子网掩码常见问题排查
  • 基于图像比对的跨平台UI一致性校验工具开发全流程指南——Android/iOS/Web三端自动化测试实战
  • 开源后台管理系统推荐
  • 从零开始用AI开发游戏(三)背景故事
  • 定时器:每五秒刷新数据