Spring Boot框架-使用自建 Exception 实现异常处理

SpringBoot [ 统一响应&&异常处理&&日志输出 ] SpringBoot [ 2.统一响应&&异常处理&&日志输出 ] - 目录 文章目录1.统一响应1.1.ExceptionConstant类,Result类2.异常处理2.1.自定义异常2.2.全局异常处理器3.日志输出 SpringBoot服务搭建服务完毕,就可以写一下服务的CURD(增删改查),但是在此之前必须要把一个项目最基本组件完善起来 1.统一响应 我... 阅读详情

我们希望能在Postman中返回操作的异常或信息
在domain package中新建Result class

    public class Result<T> {
        private Integer code;
        private String msg;
        private T data;//将data设定为泛型,用来存储返回的具体信息

        public Integer getCode() {return code;}

        public void setCode(Integer code) {this.code = code;}

        public String getMsg() {return msg;}

        public void setMsg(String msg) {this.msg = msg;}

        public T getData() {return data;}

        public void setData(T data) {this.data = data;}
    }

用Result来固定返回的信息,就返回code,msg,data三个信息
在控制器添加对Result的使用

    /**
     * 添加一个女生
     * @return
     */
    @PostMapping(value = "/girls")
    public Result<Gril> girlAdd(@Valid Gril girl, BindingResult bindingResult){//Result<Gril>存储信息数据
        if(bindingResult.hasErrors()){
            Result result = new Result();
            result.setCode(1);//随便设定
            result.setMsg(bindingResult.getFieldError().getDefaultMessage());
            result.setData("出错了0");
            return result;
        }
        girl.setCupSize(girl.getCupSzie());
        girl.setAge(girl.getAge());
        Result result = new Result();
        result.setCode(0);
        result.setMsg("成功了!");
        result.setData(girlRepository.save(girl));
        return result;
    }

返回信息:
{
    "code": 0,
    "msg": "成功了!",
    "data": {
        "id": 11,
        "age": 18,
        "cupSzie": "B"
    }
}
或者
{
    "code": 1,
    "msg": "未成年禁止入内",
    "data": "出错了0"
}

整合一下重复代码:新建一个Utils Package,建一个 ResultUtil class

public class ResultUtil {
    public static Result success(Object object){
        Result result = new Result();
        result.setCode(0);
        result.setMsg("成功!");
        result.setData(object);

        return result;
    }
    public static Result success(){
        return success(null);
    }
    public static Result error(Integer code,String msg){
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);

        return result;
    }
}

通过调用类来输出信息

    /**
     * 添加一个女生
     * @return
     */
    @PostMapping(value = "/girls")
    public Result<Gril> girlAdd(@Valid Gril girl, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            //调用 ResultUtil 
            return ResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage());
        }

        girl.setCupSize(girl.getCupSzie());
        girl.setAge(girl.getAge());
        //调用 ResultUtil 
        return ResultUtil.success(girlRepository.save(girl));
    }

我们通过这个信息返回,可以反馈给我们信息提示,比如根据提交的年龄反馈学籍
先建一个服务类

@Service
public class GirlService {

    @Autowired
    private GirlRepository girlRepository;//查询的接口
    @Autowired
    private GirlService girlService;//调用服务类

    public void getAge(Integer id){
       Gril gril = girlRepository.findById(id).get();
       Integer age = gril.getAge();
       if(age<10){
           //返回“你可能上小学”
       }else if (age>10&&age<16){
           //返回“你可能在上初中”
       }
    }
}

通过服务类来控制逻辑的判断
再在控制器新建一个判断年龄的方法

    @GetMapping(value = "/age")
    public void getAge(@PathVariable("id") Integer id){
        girlService.getAge(id);
    }

但是这样判断的方式太低效,我们通过抛异常的方式来解决

    public void getAge(Integer id) throws Exception{//抛出异常
       Gril gril = girlRepository.findById(id).get();
       Integer age = gril.getAge();
       if(age<10){
           //返回“你孩子啊上小学”
           throw new Exception("你就是个小屁孩");
       }else if (age>10&&age<16){
           //返回“你可能在上初中”
           throw new Exception("你就是个小姑娘");
       }
    }

在控制器中继续抛出异常

    @GetMapping(value = "/age")
    public void getAge(@PathVariable("id") Integer id) throws Exception{
        girlService.getAge(id);
    }

就可以收集到如下的异常

{
    "timestamp": "2018-06-23T06:56:59.466+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "你就是个小屁孩",
    "path": "/girls/getAge/1"
}

那我们要拦截异常信息并且对信息进行封装,建 handle 包,建 ExceptionHandle 类

    @ControllerAdvice
    public class ExceptionHandle {

        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public Result handle(Exception e){
            return ResultUtil.error(100,e.getMessage());
        }
    }

这样就可以实现只输出 Message 但是我们要想输出多个值怎么办? Exception 只能输出 e呀?我们自己写一个抛出类

Package excption -> Class GrilExcption

    public class GirlException extends RuntimeException {
        private Integer code;
        public GirlException(Integer code,String message) {
            super(message.toString());
            this.code = code;
        }
        public Integer getCode() {
            return code;
        }
        public void setCode(Integer code) {
            this.code = code;
        }
    }

GrilExcption类可以传进一个code参数(用来简易标记异常)和一个message参数(用来显示异常内容)我们在拦截异常信息的class ExceptionHandle中使用它

    @ExceptionHandler(value = Exception.class)//拦截异常信息
    @ResponseBody
    public Result handle(Exception e){
        if(e instanceof GirlException){//判断异常是否由自己定义
            GirlException girlException = (GirlException)e;//转换异常格式
            return ResultUtil.error(girlException.getCode(),girlException.getMessage());//完成信息的发送
        }else {
            return ResultUtil.error(-1,"未知错误");
        }
    }

那我们打出未知错误怎么知道出什么错了?拿就来做一个日志吧

    @ControllerAdvice
    public class ExceptionHandle {
        private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);

        @ExceptionHandler(value = Exception.class)//拦截异常信息
        @ResponseBody
        public Result handle(Exception e){
            if(e instanceof GirlException){//判断异常是否由自己定义
                GirlException girlException = (GirlException)e;//转换异常格式
                return ResultUtil.error(girlException.getCode(),girlException.getMessage());//完成信息的发送
            }else {
                logger.error("【系统异常】{}",e);//打印异常信息
                return ResultUtil.error(-1,"未知错误");
            }
        }
    }

其实我们可以将GrilExcption类中的参数统一起来,利用枚举类型

Package enums -> Class ResultEnum
    public enum ResultEnum {

        //建立一些枚举,替代参数
        UNKNOWN_ERROR(-1,"未知错误"),
        SUCCESS(0,"成功"),
        PRIMARY_SCHOOL(100,"你可能还在小学"),
        MIODLE_SCHOOL(101,"你可能还在上初中");

        private Integer code;

        private String msg;

        ResultEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }

        public Integer getCode() {return code;}

        public String getMsg() {return msg;}
    }

然后我们就可以修改getAge方法的参数

    public void getAge(Integer id) throws Exception{
        Gril girl = grilRepository.findById(id).get();
        Integer age = girl.getAge();
        if (age < 10) {
            //返回"你还在上小学吧" code=100
            throw new GirlException(ResultEnum.PRIMARY_SCHOOL);//替换成了枚举类型
        }else if (age > 10 && age < 16) {
            //返回"你可能在上初中" code=101
            throw new GirlException(ResultEnum.MIODLE_SCHOOL);
        }
    }
别忘了我们把枚举值转给GrilExcption类后要修改实参
    public GirlException(ResultEnum resultEnum) {
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
    }
然后负责封装异常信息的ExceptionHandle类就可以获取GrilExcption的信息输出啦
InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用) 本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。 阅读详情

相关推荐

1.2 从“跟网”到“构网”:技术范式的历史性转变

新型电力系统面临"双高"特征带来的稳定性挑战,促使并网控制技术从"跟网型"向"构网型"范式转变。传统跟网型变流器作为受控电流源依赖强电网,存在短路电流能力有限、易失稳等缺陷;而构网型变流器模拟同步发电机特性,作为受控电压源具备自主建立电压/频率、提供虚拟惯性、增强短路容量和改善系统阻尼四大核心能力。这一技术范式转变使变流器从电网跟随者变为构建支撑者,成为解决新能源大规模接入稳定性的关键。

技术工作者 725

SpringBoot实现统一异常处理

分享知识 传递快乐 Spring Boot 实现统一异常处理的方法主要有以下两种: 使用@ControllerAdvice和@ExceptionHandler注解 使用ErrorController类来实现 1、使用@ControllerAdvice和@ExceptionHandler注解 import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bin..

旷野历程 1519

AGM Supra软件从零到一:国产CPLD工程创建全流程拆解

本文详细拆解了AGM Supra软件从零开始创建国产CPLD工程的全流程,包括开发环境配置、工程创建、Quartus项目转换、TCL脚本执行与编译等关键步骤。特别强调了中文路径避坑、器件型号选择等实用技巧,帮助开发者高效完成CPLD开发任务。

weixin_29158413的博客 410

SpringBoot整合Exception实现异常处理

1.通用异常处理BusinessException,继承RuntimeException @Data @EqualsAndHashCode(callSuper = false) public class BusinessException extends RuntimeException { private static final long serialVersionUID = 1L; private int code; private String msg; publ

ChuaWi98的博客 1441

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

CH376S模块实战:如何通过串口轻松实现单片机与U盘的数据交互

本文详细介绍了如何利用CH376S模块,通过串口通信实现单片机与U盘的数据交互。文章从模块原理、硬件连接到核心指令集进行了全面解析,并提供了基于STM32的实战代码示例。CH376S模块极大地简化了USB协议和文件系统的复杂性,使开发者能快速为嵌入式设备添加便捷的数据存储与导出功能,适用于数据记录、配置导入等多种应用场景。

weixin_29165725的博客 458

SpringBoot自定义异常处理

SpringBoot自定义异常处理 当后端发生异常,前端只知道发生错误,但是不了解错误产生的原因,这里就用到了自定义异常,而且自定义异常也可以帮助事务回滚(Soring事务只有运行时异常才可回滚) 1、自定义异常类继承RuntimeException(运行时异常) public class MyException extends RuntimeException{ public MyException(String message){ super(message); } }

weixin_44349116的博客 1899

数字后端零基础入门系列 | Innovus零基础LAB学习Day9

数字后端零基础入门系列 | Innovus零基础LAB学习Day9

weixin_37584728的博客 4582

SpringBoot中的异常处理器

我们在以上的开发中,统一使用Result返回固定的数据格式给到前端,但是由于程序可能会出现BUG等问题,会导致最终返回给前端的数据,在异常情况下就又不统一了。但是以上使用,@ExceptionHandler(Exception.class)来处理异常,就太宽泛了,怎么能处理更加精确的异常呢?使用了以上注解的类,就可以接收系统中出现的异常了,但是异常出现以后,怎么处理就需要专门的处理方法来处理了.在出现异常的地方捕获异常后,再抛出我们自己定义的异常即可.此时我们就可以统一接收自己的异常了。

long1_1的博客 464

保姆级教程:在RK3588开发板上配置USB-C PD充电(基于HUSB311芯片与DTS详解)

本文详细介绍了在RK3588开发板上配置USB-C PD充电的完整流程,重点解析了HUSB311芯片的硬件原理与DTS安全配置。通过实战案例和调试技巧,帮助开发者避免常见错误,实现稳定可靠的Type-C PD快充功能,适用于从基础开发板到工业设备的多场景需求。

weixin_42552315的博客 522

Python中的字典(Dictionary)学习

上一章节,我们学习了列表(List) 和 元组(tuple) 来表示有序集合。而我们在讲列表(list)的时候,我们用了列表(list) 来存储用户的姓名。那么如果我们为了方便联系这些童鞋,要把电话号码也添加进去,该怎么做呢?但是这样很不方便,我们把电话号码记录下来,就是为了有什么事能及时联系上这些童鞋。如果用列表来存储这些,列表越长,我们查找起来耗时就越长。

热情、奔放、快乐编程! 503

Spring Boot 事务中 rollbackFor = Exception.class 的实现解析

我们常常在事务注解中,定义rollbackFor 为事务定义异常的类型。

nextera的博客 1519

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

解救应用启动危机:Spring Boot的FailureAnalyzer机制

探讨Spring Boot中的FailureAnalyzer机制,帮助解决应用启动失败的难题。对FailureAnalyzer的工作原理、生效方式以及自定义的基本步骤进行介绍,包括注册方式说明和实例演示。希望可以帮助更好地理解并利用FailureAnalyzer来诊断和解决应用启动失败的问题。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Spring Boot】异常处理

异常处理用于解决一些程序无法掌控,但又必须面对的情况。例如,程序需要读取文件、连接网络、使用数据库等,但可能文件不存在、网络不畅通、数据库无效等情况。为了程序能继续运行此时就需要把这些情况进行异常处理。

Data · Model · Agent · Repeat 2083

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java异常处理及spring boot异常统一处理

如果Java自带的异常类型不满足需求时,这时就可以自定义异常,使用自定义的异常去处理一些场景。

doubiy的博客 1277

Spring异常处理框架

Spring异常处理框架 初识底层接口类HandlerExceptionResolver HandlerExceptionResolver 是一个处理 Web 程序发生异常时的接口,当异常发生时,需要进行捕获并返回一个友好的ModelAndView给请求用户,可以通过继承AbstractHandlerExceptionResolver来实现。这个接口返回 null 表示让其他异常处理器进行处理,...

度窝-笔记 658

技术分享 | Spring Boot 异常处理

Java 异常类 首先让我们简单了解或重新学习下 Java 的异常机制。 Java 内部的异常类 Throwable 包括了 Exception 和 Error 两大类,所有的异常类都是 Object 对象。 Error 是不可捕捉的异常,通俗的说就是由于 Java 内部 JVM 引起的不可预见的异常, Java 虚拟机会选择终止线程。如 OutOfMemoryError ,就是 Java 虚拟机运行过程中出现内存资源错误抛出的。 Excetpion 异常是程序本身引起的,它又分为运行时异常 Runti.

hogwarts_2022的博客 215

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的异常处理:全局异常与自定义异常

今儿个咱唠唠 Spring Boot 里头的异常处理。

FoyoDesigner的博客 1442

Spring Boot 异步框架的使用

1. 前言随着数据量和调用量的增长,用户对应用的性能要求越来越高。另外,在实际的服务中,还存在着这样的场景:系统在组装数据的时候,对于数据的各个部分的获取实际上是没有前后依赖关系的。这些问题都很容易让我们想到将这些同步调用全都改造为异步调用。不过自己实现起来比较麻烦,还容易出错。好在Spring已经提供了该问题的解决方案,而且使用起来十分方便。2.Spring异步执行框架的使用方法2.1 mave...

weixin_34356555的博客 659

在Spring Boot框架下的Java异常处理(包含SLF4J日志记录)

你可以根据业务需求创建自定义异常类,通常继承自Exception或。1.5.1 继承Exception类创建一个受检异常类,调用者需要处理它。1.5.2 继承类创建一个非受检异常类,不强制要求调用者处理。throw new CustomUncheckedException("值不能为负数");Exception和是Java异常体系的核心。受检异常必须捕获或声明,非受检异常可以选择处理。是处理异常的主要机制,finally用于资源释放。throws用于声明方法可能抛出的异常。可以通过继承。

m0_73837751的博客 1717

Spring Boot 使用 Spring Data JPA 实现增删改查

本文介绍了如何使用Spring Boot 3、Spring Data JPA和MySQL实现用户增删改查功能。主要内容包括:技术栈选择(Java 17+、Spring Boot 3.5.x等)、项目创建(通过Spring Initializr)、Maven依赖配置、MySQL数据库设置、application.yml配置文件说明,以及实体类User的创建(包含@Entity注解和唯一约束定义)。文章提供了完整的项目结构和关键代码片段,适合开发者快速上手Spring Data JPA的基本使用。

qq_29029209的博客 308

springboot 事务 抛出异常_spring boot 异常(exception)处理

章节Spring Boot 介绍Spring Boot 开发环境搭建(Eclipse)Spring Boot Hello World (restful接口)例子spring boot 连接Mysqlspring boot配置druid连接池连接mysqlspring boot集成mybatis(1)spring boot集成mybatis(2) – 使用pagehelper实现分页spring b...

weixin_32816613的博客 2778

Spring Boot 参数校验与异常处理

如何在上述 8 个属性的基础上,扩展自定义的信息呢?创建一个类,继承(此处需要特别注意基类的路径,容易错误引用为通过@Component注解将类交托于 Spring 管理;重写方法,调用基类同名方法,在获取的Map结果集中进行自定义信息的扩展。@Component@Overridemap.put("system", "XXXX 系统");map.put("company", "XXXX 公司");return map;有点神奇是不是?

Java技术攻略的博客 1952

Spring Boot 自定义异常处理

文章目录自定义异常类,继承RuntimeException全局异常处理响应结果枚举类测试自定义异常处理 自定义异常类,继承RuntimeException /** * 自定制异常类 * * @author MoCha * @date 2019/5/25 */ @Getter public class CustomException extends RuntimeException { ...

IceStreamLab 9691

Spring Boot错误异常处理04

Spring Boot错误处理 1、运行结果 2、写程序: 1、建立Spring Boot jsp的基础上进行修改程序 2、修改HelloController package com.zwh.springboot02.controller; import java.text.DateFormat; import java.util.Date; import org.springframework.stereotype.Controller; import org.springframework

绝世无敌的笨垃圾 255

Java异常体系、UncaughtExceptionHandler、Spring MVC统一异常处理、Spring Boot统一异常处理

Java异常体系概述、try...catch...finally语句块、常见异常、最佳实践; 异常表、异常throw事件;UncaughtExceptionHandler、Spring MVC异常处理机制、Spring MVC全局异常处理、Spring Boot全局异常处理

lonelymanontheway的博客 1521
上一篇: Spring Boot框架-使用AOP处理请求
下一篇: Spring Boot框架-使用 @SpringBootTest 进行单元测试
joen.chen
博客等级 码龄10年 76粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值