未经博主允许不得转载:

  自定义异常,不仅需要定义符合自己业务的异常状态码,也需要定义自己项目中的异常封装。记录下自己手敲代码中的异常封装:

1.定义一个枚举类,枚举类中定义状态码及状态码描述,再定义一个接口,使枚举类实现该接口,从而可以获取枚举类中当前的异常状态码,异常描述等。

package com.lf.mp.test;

/**
* 用来获取异常的状态码及描述
*/
public interface ExceptionType {
// 获取描述
public String getMessage(); // 获取状态码
public Integer getCode(); // 是否参数化
public Boolean isParam();
}
package com.lf.mp.test;

/**
* 自定义异常枚举
*/
public enum ExceptionEnum implements ExceptionType {
NOT_FOUNT(404, "页面或路径不存在"), METHOD_NOT_ALLOWED(405, "方法不允许", true), USEER_NOT_EXISTED(100001, "用户不存在"), PARAM_ERROR(100002, "参数错误", true), // 对于参数使用异常这种场景,会对参数进行不同的描述,这里可使用{}的方式代替,在解析的时候对{}进行替换
PARAMS_ERROR(100002, "{}"),;
// 状态码
private Integer code;
// 状态码描述
private String message;
// 是否参数解析
private boolean isParam; // 重载
ExceptionEnum(Integer code, String message, boolean isParam) {
this.code = code;
this.message = message;
this.isParam = isParam;
} // 重载
ExceptionEnum(Integer code, String message) {
this.code = code;
this.message = message;
} @Override
public String getMessage() {
this.message = message;
return message;
} @Override
public Integer getCode() {
return this.code;
} @Override
public Boolean isParam() {
return this.isParam;
}
}

2.自定义异常类;

package com.lf.mp.test;

import lombok.Data;

import java.io.Serializable;

/**
* 自定义业务异常
*/
@Data
public class CustomException extends RuntimeException implements Serializable {
private static final long serialVersion = 493083738120393040L;
private ExceptionEnum exceptionEnum;
private Integer code;
private String message; // 对自定义异常进行构造封装
public CustomException(ExceptionEnum exceptionEnum) {
this.exceptionEnum = exceptionEnum;
this.message = exceptionEnum.getMessage();
this.code = exceptionEnum.getCode();
} public CustomException(String message, ExceptionEnum exceptionEnum) {
super(message);
this.exceptionEnum = exceptionEnum;
this.message = message;
} public CustomException(Throwable cause, ExceptionEnum exceptionEnum) {
this.exceptionEnum = exceptionEnum;
this.message = cause.getMessage();
} }

3.自定义异常捕捉后返回的数据接口

package com.lf.mp.test;

import lombok.Data;

/**
* 定义response响应数据体
*/
@Data
public class Result {
// 状态码
private Integer code;
// 响应描述
private String msg;
// 响应数据
private Object data; public Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}

4.通过@ControllerAdvice 或 @RestControllerAdvice 注解封装项目中的异常

  通过@ControllerAdvice ,可以将对于控制器的全局配置放置在同一个位置,注解了@Controller 的类的方法可以使用@ExceptionHandler,@InitBinder,@ModelAttribute注解

到方法上,这对所有注解了@RequestMapping 的控制器内的方法有效。

  @ExceptionHandler:用于全局处理控制器里的异常

  @InitBinder: 用来设置WebDataBinder,WebDataBinder 用来自动绑定前台请求参数到Model中

  @ModelAttribute:绑定键值对到Model里,此处是让全局的@RequestMapping 都能获得在此处设置的键值对。

        

  @RestControllerAdvice 则是@ControllerAdvice 与 @ResponseBody 的合体

       @ResponseBody 支持将返回值放在response 体内,而不是返回一个页面。我们在很多基于ajax 的程序的时候,可以一次注解返回数据而不是页面。

package com.lf.mp.test;

import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 全局异常处理器
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
//处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
@ExceptionHandler(BindException.class)
public Result BindExceptionHandler(BindException e) {
return new Result(ExceptionEnum.METHOD_NOT_ALLOWED.getCode(), e.getMessage());
} @ExceptionHandler(CustomException.class)
public Result customExceptionHandler(HttpServletRequest request, final CustomException exception, HttpServletResponse response) {
response.setStatus(HttpStatus.BAD_REQUEST.value());
return new Result(exception.getCode(), exception.getMessage());
} @ExceptionHandler(MethodArgumentNotValidException.class)
public Result MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
return new Result(ExceptionEnum.METHOD_NOT_ALLOWED.getCode(), exception.getMessage());
} }

使用示例如下:

    private void test() {
try {
int a = 1/0;
} catch (CustomException e) {
throw new CustomException(ExceptionEnum.OTHER_ERROR,"计算异常");
}
}

-----

这种异常的封装很简洁,也很好使用,对项目的异常状态码,异常描述都有较好的封装。使用也很方便。

还有一种经常使用的异常封装。定义一个CustomException,并继承Exception类,在CustomException中定义异常状态码,以描述两个属性,

在使用过程中,状态码则使用HttpStatus中的异常码,描述则使用自定义描述,也很方便,主要符合自己业务,方便开发即可。

项目使用 GlobalExceptionHandler 与 @RestControllerAdvice自定义异常 二的更多相关文章

  1. Java Web项目(Extjs)报错二

    1.Java Web项目(Extjs)报错二 具体报错如下: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ...

  2. Java项目:学生成绩管理系统(二)

    学生成绩管理系统(二):项目介绍 一.设计要求: 1.1 简单的图形界面登录功能. 1.2 对数据库的的信息的查询功能. 1.3 对数据库的的信息的修改功能. 1.4 对数据库的的信息的删除功能. 1 ...

  3. vue-cli+webpack在生成的项目中使用bootstrap方法(二)

    vue-cli+webpack在生成的项目中使用bootstrap方法(一)中,是通过手动下载bootstrap库,然后手动添加到src/assets中,显然是过程太多. 当然是可以更省力些,可以通过 ...

  4. Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)

    一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring r ...

  5. 【spring】在spring cloud项目中使用@ControllerAdvice做自定义异常拦截,无效 解决原因

    之前在spring boot服务中使用@ControllerAdvice做自定义异常拦截,完全没有问题!!! GitHub源码地址: 但是现在在spring cloud中使用@ControllerAd ...

  6. serverless 项目配置及创建helloworld应用(二)

    阅读目录 一:学习使用AWS Lambda来作为服务器引擎 二:使用serverless环境搭建 三:创建我们的第一个应用,hello world 服务 回到顶部 一:学习使用AWS Lambda来作 ...

  7. Redis项目实战---应用及理论(二)---Redis集群原理

    一. Redis官方推荐集群方案:Redis Cluster 适用于redis3.0以后版本,        redis cluster 是redis官方提供的分布式解决方案,在3.0版本后推出的,有 ...

  8. 三:后台的登录注册接口(moon项目,前面有一,二)

    ** 项目一共有 16 个页面,是一个电商网销项目,自己在网上的某网上找的一个要做的网站的设计图: 页面主要包括:  登录页 -- 注册页 -- 首页 -- 产品列表页 -- 产品详情页 -- 会员中 ...

  9. 【Vue项目】商品汇前台(二)进度条插件+Vuex模块化仓库+函数的防抖与节流+路由传参

    前言 1 nprogress进度条的使用 当请求发出进度条出现并向前走,请求成功后进度条消失.nprogress是一种进度条插件 1.1 nprogress进度条插件安装 npm i --save n ...

  10. 模拟搭建Web项目的真实运行环境(二)

    上一节已经介绍了如何在虚拟机中部署测试环境,接下来将介绍怎么在ubuntu下部署redis.   一.在ubuntu安装Xrdp + Vnc 为了在以后可以通过windows系统来远程操作ubuntu ...

随机推荐

  1. 'parent.relativePath' of POM com.qbb:log_record_elegant:1.0-SNAPSHOT points at com.qbb:qiu_code instead of org.springframework.boot:spring-boot-starter-parent

    完整的错误: 'parent.relativePath' of POM com.qbb:log_record_elegant:1.0-SNAPSHOT (F:\QbbCode\qiu_code\log ...

  2. 流畅的orm让我发现我抵触的是mybatis而不是java

    流畅的orm让我发现我抵触的是mybatis而不是java 背景介绍 开发.net 也快10年了,到第三年的时候我已经渐渐瓶颈了,于是我在网上找各种资料但是大部分c#资料全是皮毛资料,稍微深一点点就再 ...

  3. mac如何访问同一wifi下的项目-mac-ru-he-fang-wen-tong-yi-wifi-xia-de-xiang-mu

    title: mac如何访问同一wifi下的项目 date: 2022-03-28 20:14:06.341 updated: 2022-03-28 21:55:42.53 url: https:// ...

  4. NSSCTF Round#16 Basic crypto misc-wp

    CRYPTO pr 题目 CRT from Crypto.Util.number import * import random flag=plaintext = 'NSSCTF{*********** ...

  5. Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger

    什么是 Swagger? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.它提供了一种规范的方式来定义.构建和文档化 RESTful Web ...

  6. 5步教你将MRS数据导入DWS

    摘要:GaussDB(DWS)支持在相同网络中,配置一个GaussDB(DWS)集群连接到一个MRS集群,然后将数据从HDFS中的文件读取到GaussDB(DWS). MapReduce服务(MapR ...

  7. 云小课 | 玩转HiLens Studio之快速订购HiLens Studio版本

    摘要:华为HiLens是端云协同多模态AI开发应用平台,提供给开发者的多语言类集成开发环境HiLens Studio,开发者可以在HiLens Studio 中编写和调试技能代码. 本文分享自华为云社 ...

  8. 火山引擎数智平台VeDI荣获虎啸奖“年度最佳智能营销平台”奖项

    近日,由中国商务协会数字营销专业委员会指导的第十四届虎啸奖正式公布获奖名单,火山引擎数智平台VeDI荣获技术平台/产品类奖项.   作为国内品牌营销领域兼具权威性.前瞻性以及创新性的赛事活动,第十四届 ...

  9. 火山引擎 DataTester :让字节“跳动”起来的 A/B 实验平台

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流 火山引擎 DataTester 不仅对外提供服务,同时也是当前字节跳动内部所应用的 AB 实验平台. DataTes ...

  10. 你正在调试XXX的发布版本,如果在启用 仅我的代码 的同时,使用通过编译器优化的发布版本

    仅我的代码"警告 你正在调试 XXX.dll 的发布版本.如果在启用"仅我的代码"的同时使用通过编译器优化的发布版本,调试体验会降级(例如,将不会命中断点) 停止调试禁用 ...