使用springboot搭建web项目的时候,一般都会添加一个全局异常类,用来统一处理各种自定义异常信息,

和其他非自定义的异常信息,以便于统一返回错误信息。下面就是简单的示例代码,

自定义异常信息.

public class MyException extends RuntimeException{

private String errorCode = ResultEnum.OTHER_EXCEPTION.getCode();

private String errorMessage ;

public String getErrorCode() {
return errorCode;
}

public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}

public String getErrorMessage() {
return errorMessage;
}

public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}

public MyException() {
super();
}

public MyException(String errorCode, String... errorParam) {
super();
setErrorMessage(errorCode, errorParam);
}

private void setErrorMessage(String code, String... param) {
this.errorCode = code;
if (param == null) {
this.errorMessage = "系统异常";
} else if (param.length == 1) {
this.errorMessage = param[0];
} else if (param.length > 1) {
this.errorMessage = "系统异常";
}
}
}

全局异常信息处理类.

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

/*
* 处理自定义异常
*/
@ExceptionHandler(value = MyException.class)
public @ResponseBody JsonResult exceptionHandler (MyException myException) {
log.info("exceptionHandler--->{}", myException);
JsonResult jsonResult = new JsonResult();
jsonResult.setErrorCode(myException.getErrorCode());
jsonResult.setErrorMessage(myException.getErrorMessage());
return jsonResult;
}

/*
* 处理参数校验异常-1
* */
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public @ResponseBody JsonResult methodArgumentNotValidExceptionHandler (MethodArgumentNotValidException mANValidException) {
log.info("参数校验异常1!");
JsonResult jsonResult = new JsonResult();
jsonResult.setErrorCode(ResultEnum.PARAMS_ERROE.getCode());
// 获取所有的校验错误信息
List<ObjectError> allErrors = mANValidException.getBindingResult().getAllErrors();
StringBuilder sb = new StringBuilder();
// 处理错误的校验信息
if (allErrors != null && allErrors.size() > 1) {
allErrors.forEach(item->sb.append(item.getDefaultMessage()).append("#"));
} else {
allErrors.forEach(item->sb.append(item.getDefaultMessage()));
}
jsonResult.setErrorMessage(sb.toString());
return jsonResult;
}

/*
* 处理系统异常
* */
@ExceptionHandler(value = Exception.class)
public @ResponseBody JsonResult constraintViolationExceptionHandler (Exception exception) {
log.info("exception--->{}", exception);
JsonResult jsonResult = new JsonResult();
jsonResult.setErrorCode(ResultEnum.SYSTEM_EXCEPTION.getCode());
jsonResult.setErrorMessage(ResultEnum.SYSTEM_EXCEPTION.getMsg());
        return jsonResult;
}
}
返回信息处理类.
@Data
public class JsonResult<T> implements Serializable {

private static final long serialVersionUID = -7866290240453139258L;

//返回时间
private String responseDate = null;

//返回状态
private String status = null;

//错误码
private String errorCode = null;

//错误信息
private String errorMessage = null;

//接口返回对象
private T responseBody = null;

public JsonResult() {
this.status = "SUCCESS";
this.responseDate = (new Date()).toString();
}

public JsonResult(T responseBody) {
this();
this.status = "SUCCESS";
this.responseBody = responseBody;
this.errorCode = "";
this.errorMessage = "";
}

public JsonResult<T> declareSuccess(T responseBody) {
this.status = "SUCCESS";
this.responseBody = responseBody;
this.errorCode = "";
this.errorMessage = "";

return this;
}

public JsonResult<T> declareFailure(MyException e, T responseBody) {
return declareFailure(e.getMessage(), e.getMessage(), responseBody);
}

public JsonResult<T> declareFailure(String errorCode, String errorMessage, T responseBody) {
this.status = "FAILURE";
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.responseBody = responseBody;

return this;
}
}
错误信息返回的枚举类.
public enum ResultEnum {

SUCCESS("1000", "成功"),

FAILED("1001", "失败"),

PARAMS_ERROE("1002", "参数错误"),

OTHER_EXCEPTION("1003", "其他错误"),

SYSTEM_EXCEPTION("0000", "系统异常"),
;
/*
* 返回码
*/
private String code;

/*
* 返回消息
*/
private String msg;

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

public String getCode() {
return code;
}

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

public String getMsg() {
return msg;
}

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

测试的controller如下

@Slf4j
@RestController
public class TestControlelr {


@Autowired
private TestMapper testMapper;


@PostMapping("/exception/test")
public JsonResult exceptionTest(@Validated @RequestBody ParamTest paramTest){
TestPO testPO = new TestPO();
testPO.setNewTable("app_goods_info");
int total = testMapper.selectTotal(testPO);
System.out.println("total--->" + total);


JsonResult jsonResult = new JsonResult();
jsonResult.declareSuccess("异常测试接口:" + total);


return jsonResult;
}


@GetMapping("/exception/test/two")
public JsonResult exceptionTestTwo(){
int total = 10;
System.out.println("total--->" + total);
int temp = 1 / 0;
JsonResult jsonResult = new JsonResult();
jsonResult.declareSuccess("异常测试接口:" + total);
return jsonResult;
}


@PostMapping("/exception/test/three")
public JsonResult exceptionTestThree(){
int total = 10;
System.out.println("total--->" + total);
if (total > 8) {
throw new MyException(ResultEnum.FAILED.getCode(), "测试自定义异常");
}
JsonResult jsonResult = new JsonResult();
jsonResult.declareSuccess("异常测试接口:" + total);
return jsonResult;
}
}

测试的入参类如下:
@Data
public class ParamTest {

/*
* 名称
*/
@NotNull(message = "名称不能为null")
private String name;

/*
* 简介
*/
@Length(max = 10, message = "简介长度最大为10")
private String abs;
}
测试一:填写错误的参数,返回信息如下。

测试二:测试在代码中写1/0的返回结果。

测试三:主动抛出一个自定义异常,返回结果如下。

在全局异常处理类中添加了三个方法,一个方法用来处理自定义异常的错误返回信息,一个方法用法用来返回参数校验的错误返回信息,

最后一个方法用来处理系统异常,三个方法都可以正常执行。真实开发中可以根据实际需要去添加一些自定义

异常信息,根据需要使用全局异常类来进行统一处理,这样可以很方便的从错误信息中分辨出是什么地方出现问题,便于快速排查问题。

												

Springboot中-全局异常处理类用法示例的更多相关文章

  1. springboot的全局异常处理类

    import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import or ...

  2. 【springboot】全局异常处理

    转自: https://blog.csdn.net/cp026la/article/details/86495196 前言: 开发中异常的处理必不可少,常用的就是 throw 和 try catch, ...

  3. SpringMVC的处理器全局异常处理类

    SpringMVC的处理器全局异常处理类 package com.huawei.utils; import org.springframework.web.servlet.HandlerExcepti ...

  4. springBoot的全局异常处理

    GlobalException.java package com.bank.util; import com.bank.exception.ContentEmpyException; import c ...

  5. SpringBoot中对于异常处理的提供的五种处理方式

    1.自定义错误页面 SpringBoot 默认的处理异常机制:SpringBoot默认的已经提供了一套处理异常的机制.一旦程序中出现了异常,SpringBoot会向/error的url发送请求.在Sp ...

  6. springmvc、 springboot 项目全局异常处理

    异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况. 准备工作: 在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个js ...

  7. SpringBoot中SpringMVC异常处理机制

    声明 源码基于SpringBoot 2.3.12 前置知识 Tomcat异常处理机制 使用例子 原理简要介绍 先来看下Spring Boot中默认的处理行为,如果DispatcherServlet执行 ...

  8. SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务

    ============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...

  9. SpringBoot中的异常处理方式

    SpringBoot中有五种处理异常的方式: 一.自定义错误页面 SpringBoot默认的处理异常机制:SpringBoot默认的已经提供了一套处理异常的机制.一旦程序出现了异常SpringBoot ...

  10. C#中this指针的用法示例

    这篇文章主要介绍了C#中this指针的用法,对初学者而言是非常重要的概念,必须加以熟练掌握,需要的朋友可以参考下. 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体 ...

随机推荐

  1. LyScript 计算片段Hash并写出Excel

    本案例将学习运用LyScript计算特定程序中特定某些片段的Hash特征值,并通过xlsxwriter这个第三方模块将计算到的hash值存储成一个excel表格,本例中的知识点可以说已经具备了简单的表 ...

  2. 【内存操作】C语言内存函数介绍以及部分模拟实现【初学者保姆级福利】超详细的解释和注释

    C语言 内存函数的使用以及部分模拟实现 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注 ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    2.3.4 Web API -- MVC终结点 MVC与MVVM 模型绑定 自定义模型绑定器 模型验证 返回数据处理 MVC与MVVM MVC ASP.NET Core MVC 概述:https:// ...

  4. Python numpy数组操作(分割数组)

    分割数组 函数 数组及操作 split 将一个数组分割为多个子数组 hsplit 将一个数组水平分割为多个子数组(按列) vsplit 将一个数组垂直分割为多个子数组(按行) numpy.split ...

  5. NC25064 [USACO 2007 Mar G]Ranking the Cows

    题目链接 题目 题目描述 Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate ...

  6. Java 封装、继承、多态的理解

    更好的阅读体验:Java 封装.继承.多态的理解 1.封装 封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式.让使用者知道的才暴露出来,不需要让使用者知道的全部隐藏起来 封装的好处:避免使用 ...

  7. Js中数组空位问题

    Js中数组空位问题 JavaScript中数组空位指的是数组中的empty,其表示的是在该位置没有任何值,而且empty是区别于undefined的,同样empty也不属于Js的任何数据类型,并且在J ...

  8. 解密C语言选择结构:掌握条件语句与分支逻辑的利器

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构.选择结构.循环结构.为什么有 ...

  9. Feign入门介绍

    Feign入门介绍 基本概述 除Feign之外,在Java中经常使用的HTTP客户端组件主要有3个,如下: (1)HttpURLConnection,JDK自带 (2)Apache HttpClien ...

  10. dd命令创建文件

    dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...