当前位置:网站首页>24:第三章:开发通行证服务:7:自定义异常(来表征程序中出现的错误);创建GraceExceptionHandler来全局统一处理异常(根据异常信息,构建对应的API统一返回对象的,JSON数据);
24:第三章:开发通行证服务:7:自定义异常(来表征程序中出现的错误);创建GraceExceptionHandler来全局统一处理异常(根据异常信息,构建对应的API统一返回对象的,JSON数据);
2022-06-30 15:44:00 【小枯林】
说明:
(1)在【Spring Boot电商项目16:用户模块五:注册接口开发之:自定义异常类;(来为处理【非Controller层出现的错误】做准备;)】,
【Spring Boot电商项目17:用户模块六:注册接口开发之:使用【GlobalExceptionHandler】来全局统一处理异常;】介绍过自定义异常,以及全局统一处理自定义异常的策略;在了解本篇博客之前,务必要先去参考一下上面两篇博客;
● 本篇博客的做法,和以前的做法一样;;只是,在具体实现上,错在一丢丢的差异;
在【23:第三章:开发通行证服务:6:限制用户60内不能重复访问【发送短信,接口】;】中,在拦截器中,如果出现了“用户在60秒内重复访问【发送短信,接口】”的“错误情况”时,我们只是打印了一句话;;;一种正规的做法,我们可以通过抛一个异常,来表征这种“错误情况”,
目录
1.在【imooc-news-dev-common】通用工程中,创建exception包;
2.创建自定义异常:MyCustomException;(继承的是RuntimeException)
3.创建工具类:GraceException:根据传进来的【ResponseStatusEnum枚举类】,创建(并抛出)对应的自定义MyCustomException异常对象;
4.创建“统一处理异常的handler类”:GraceExceptionHandler类:来全局统一处理异常,即根据【异常信息】转成对应的【API统一返回对象】;
一:正式开发;
1.在【imooc-news-dev-common】通用工程中,创建exception包;
有关异常相关的类,我们可以放在这个包中;
2.创建自定义异常:MyCustomException;(继承的是RuntimeException)
package com.imooc.exception; import com.imooc.grace.result.ResponseStatusEnum; /** * 自定义异常; * 目的:统一处理异常信息;便于管理,便于解耦; */ public class MyCustomException extends RuntimeException { //枚举类对象 private ResponseStatusEnum responseStatusEnum; /** * 无参构造;没什么用; * 只是,因为我们声明一个有参构造,其无参构造就自动GG了; * 为了防止,以后可能出现不必要的麻烦,所以自己给其加了无参构造; */ public MyCustomException() { } /** * 有参构造:根据【传进来的,表征错误信息的ResponseStatusEnum枚举类对象】,可以 * 实例化一个【MyCustomException异常对象】 * @param responseStatusEnum */ public MyCustomException(ResponseStatusEnum responseStatusEnum) { super("异常状态码为:" + responseStatusEnum.status() + ";异常的具体信息为:" + responseStatusEnum.msg()); this.responseStatusEnum = responseStatusEnum; } public ResponseStatusEnum getResponseStatusEnum() { return responseStatusEnum; } public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) { this.responseStatusEnum = responseStatusEnum; } }说明:
(1)我们这个自定义异常,继承的是RuntimeException;;而,我们在 【Spring Boot电商项目16:用户模块五:注册接口开发之:自定义异常类;】中的自定义异常,继承的是Exception;
● 通过【Java异常一:异常定义;异常的分类】可知,RuntimeException是非检查异常;;;所以,当我们在程序中抛出一个RuntimeException异常时候,我们不需要对其进行try-catch;;;;这样一来,我们对代码不太会有“侵入性”;
(2)已知,我们在枚举类中,定义了很多错误信息;;;;;当程序发生错误的时候,我们有时就可以根据对应的错误信息,构建一个自定义的MyCustomException异常对象;
3.创建工具类:GraceException:根据传进来的【ResponseStatusEnum枚举类】,创建(并抛出)对应的自定义MyCustomException异常对象;
package com.imooc.exception; import com.imooc.grace.result.ResponseStatusEnum; /** * 工具类:根据【传进来的,表征错误信息的ResponseStatusEnum枚举类对象】,统 * 一封装【我们自定义的异常MyCustomException异常,的对象】 */ public class GraceException { /** * 根据传进来的【ResponseStatusEnum枚举类, * 创建并抛出我们自定义的异常MyCustomException对象】 * @param responseStatusEnum */ public static void display(ResponseStatusEnum responseStatusEnum) { throw new MyCustomException(responseStatusEnum); } }说明:
(1)类内容说明;
上面,当我们在程序中抛出一个自定义异常后,这个被抛出的自定义异常,需要被容器捕获到;;;容器捕获到这个自定义异常后,我们才能把对应的具体的错误的信息,抛给前端;
所以,此时我们需要做一个统一的拦截;这就是下面的内容了;
4.创建“统一处理异常的handler类”:GraceExceptionHandler类:来全局统一处理异常,即根据【异常信息】转成对应的【API统一返回对象】;
package com.imooc.exception; import com.imooc.grace.result.GraceJSONResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * 统一异常拦截处理异常; * 可以针对异常的具体信息,构建对应的GraceJSONResultAPI统一返回对象,给前端; */ @ControllerAdvice public class GraceExceptionHandler { @ExceptionHandler(MyCustomException.class) @ResponseBody public GraceJSONResult returnMyException(MyCustomException e) { e.printStackTrace(); return GraceJSONResult.exception(e.getResponseStatusEnum()); } }说明:
(1)我们在【Spring Boot电商项目17:用户模块六:注册接口开发之:使用【GlobalExceptionHandler】来全局统一处理异常;】中,做过类似的工作;;;;这儿的内容,在这篇博客中,都有介绍;
(2)一看【@ControllerAdvice】注解,其实就能明白,这儿也利用AOP的原理,去实现的;
(3)这儿,其实就是根据【异常信息】转成对应的【API统一返回对象】;;;我们在【14:第二章:架构后端项目:10:封装“返回结果”;】中,创建了【API统一返回对象】即GraceJSONResult类;
(4)自我感觉(理解可能存在偏差甚至是错误):
● 说法1:在马上要响应了,即马上要返回给前端内容的时候(PS:这个节骨眼时,不一定是Controller哦,也可能是拦截器;;即,直接向前端返回信息的,不一定是Controller,也可能是拦截器等),发现其还存在一个MyCustomException异常;;;;;那么,我们这儿创建的GraceExceptionHandler类,其使用了【 @ExceptionHandler(MyCustomException.class)】注解的那个方法,就会捕获,根据其中的【异常信息】转成对应的【API统一返回对象】的JSON格式的数据,返回给前端;
● 说法2:这个GraceExceptionHandler类,会实时监控【马上要返回给前端内容的那个点】(此处,Controller和拦截器,可以认为是等价一样的);;如果,其有MyCustomException异常;;;那么,我们这儿创建的GraceExceptionHandler类,其使用了【 @ExceptionHandler(MyCustomException.class)】注解的那个方法,就会捕获,根据其中的【异常信息】转成对应的【API统一返回对象】的JSON格式的数据,返回给前端;
二:然后, 在【23:第三章:开发通行证服务:6:限制用户60内不能重复访问【发送短信,接口】;】中,在拦截器中,如果出现了“用户在60秒内重复访问【发送短信,接口】”的“错误情况”时,就可以抛出一个对应的异常了;
三:效果;
(1)先全局install一下整个项目;
(2)然后,启动【user】的主启动类;
(3)然后,在前端页面上,连续两次访问【发送短信接口】;(PS:记得开启SwitchHosts虚拟域名)
边栏推荐
- IIS无法加载字体文件(*.woff,*.svg)的解决办法
- How to get the preferential activities for stock account opening? Is online account opening safe?
- 如何得到股票开户的优惠活动?在线开户安全么?
- 什么是XR扩展现实,XR云串流平台有哪些
- ASP. Net core signalr series hub tutorial
- MySQL proxy middleware atlas installation and configuration
- microblaze 串口学习·2
- What role does "low code" play in enterprise digital transformation?
- Policy Center > Malware > Malware
- Data governance Market: Yixin Huachen faces left, Huaao data faces right
猜你喜欢
![[附下载]渗透测试神器Nessus安装及使用](/img/ef/b6a37497010a8320cf5a49a01c2dff.png)
[附下载]渗透测试神器Nessus安装及使用

云化XR,如何助力产业升级

Finally understand science! 200 pictures to appreciate the peak of human wisdom

Modifying MySQL password under Linux: error 1396 (HY000): Operation alter user failed for 'root' @ 'localhost‘

构建适合组织的云原生可观测性能力

《你的灯亮着吗》开始解决问题前,得先知道“真问题”是什么

ASP. Net core signalr tutorial
![[leetcode] linked list sorting (gradually increasing the space-time complexity)](/img/0e/b8d0305babb42b6fab85b45c47d705.png)
[leetcode] linked list sorting (gradually increasing the space-time complexity)

Policy Center-User Data

Generating verification code with sring
随机推荐
Open source STM32 USB-CAN project
详解Go语言中for循环,break和continue的使用
Policy Center > Deceptive Behavior
Data governance Market: Yixin Huachen faces left, Huaao data faces right
【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例
Asp.NetCore利用缓存使用AOP方式防止重复提交
《网络是怎么样连接的》读书笔记 - 汇总篇
19:00 p.m. tonight, knowledge empowerment phase 2 live broadcast - control panel interface design of openharmony smart home project
topic: Privacy, Deception and Device Abuse
Using asp Net core creating web API series
Log4j2 advanced use
CVPR 2022 - Tesla AI proposed: generalized pedestrian re recognition based on graph sampling depth metric learning
Which direction should college students choose to find jobs after graduation?
Policy Center-User Data
Go-Micro安装
Lecun points out the direction of next generation AI: autonomous machine intelligence
Policy Center > Misrepresentation
Cloud XR, how to help industrial upgrading
Policy Center > Deceptive Behavior
LeCun指明下一代AI方向:自主机器智能











