spring-boot-route(四)全局异常处理

漏洞挖
• 阅读 123

在开发中,我们经常会使用try/catch块来捕获异常进行处理,如果有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候我们可以使用全局异常处理。这样就不用在代码中写那些烦人的try/catch块了,代码的可读性也会提高。

SpringBoot提供的的注解@ControllerAdvice表示开启全局异常捕获,在自定义的异常方法上使用ExceptionHandler来进行统一处理。

下面一起看看如何优雅的处理全局异常!

一 定义响应状态码及信息的枚举类
@Getter
public enum CodeEnum {


SUCCESS(0,"请求成功"),
ERROR(500,"未知异常"),
ERROR_EMPTY_RESULT(1001,"查询结果为空"),
ERROR_INCOMPLETE_RESULT(1002,"请求参数不全");

private int code;
private String message;
CodeEnum(int code,String message){
    this.code = code;
    this.message = message;
}

}
二 定义响应数据的实体类
@Slf4j
@Data
public class R<T> implements Serializable {

private static final long serialVersionUID = 572235155491705152L;
/**
 * 响应的状态码
 */
private int code;
/***
 * 响应的信息
 */
private String message;
/**
 * 响应数据
 */
private T data;

/**
 * 放入响应码并返回
 * @param code
 * @param msg
 * @return
 */
public R fillCode(int code,String msg){
    this.code = code;
    this.message = msg;
    return this;
}

/**
 * 放入响应码并返回
 * @param codeEnum
 * @return
 */
public R fillCode(CodeEnum codeEnum){
    this.code = codeEnum.getCode();
    this.message = codeEnum.getMessage();
    return this;
}

/**
 * 放入数据并响应成功状态
 * @param data
 * @return
 */
public R fillData(T data){
    this.code = CodeEnum.SUCCESS.getCode();
    this.message = CodeEnum.SUCCESS.getMessage();
    this.data = data;
    return this;
}

}
三 自定义两个异常
根据业务需求自定义异常,在本文中我定义了两个异常,分别用作响应结果为空时处理和请求参数错误时处理。

@Data
public class EmptyResutlException extends RuntimeException {

private static final long serialVersionUID = -8839210969758687047L;
private int code;
private String message;

public EmptyResutlException(CodeEnum codeEnum){
    this.code = codeEnum.getCode();
    this.message = codeEnum.getMessage();
}

}
@Data
public class RequestParamException extends RuntimeException {

private static final long serialVersionUID = 4748844811214637041L;
private int code;
private String message;

public RequestParamException(CodeEnum codeEnum){
    this.code = codeEnum.getCode();
    this.message = codeEnum.getMessage();
}

}
四 定义全局异常处理类
由于这里我想要响应的结果为实体类对象,因此我直接用@RestControllerAdvice来代替了@ControllerAdvice,这两个注解的差别跟@Controller和@RestController一样,rest的响应体为json格式的数据。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

/**
 * 查询结果为空时处理
 * @param e
 * @return
 */
@ExceptionHandler(EmptyResutlException.class)
public R emptyResultExceptionHandler(EmptyResutlException e){
    log.error("查询结果为空:{}",e.getMessage());
    R result = new R();
    result.fillCode(e.getCode(),e.getMessage());
    return result;
}

/**
 * 请求参数错误时处理
 * @param e
 * @return
 */
@ExceptionHandler(RequestParamException.class)
public R requestParamExceptionHandler(RequestParamException e){
    log.error("请求参数不合法:{}",e.getMessage());
    R result = new R();
    result.fillCode(e.getCode(),e.getMessage());
    return result;
}

/**
 * 处理其他异常
 * @param e
 * @return
 */
@ExceptionHandler(Exception.class)
public R exceptionHandler(Exception e){
    log.error("未知异常:{}",e.getMessage());
    R result = new R();
    result.fillCode(CodeEnum.ERROR);
    return result;
}

}
五 自定义接口测试异常
@RestController
public class TestController {

@GetMapping("getString")
public R getString(String name){

    if(StringUtils.isEmpty(name)){
        throw new RequestParamException(1002,"请求参数name为空");
    }else if ("Java旅途".equals(name)) {
        // 这里没有查询操作,当请求参数是Java旅途的时候,模拟成查询结果为空
        throw new EmptyResutlException(1001,"查询结果为空");
    }
    // 这里模拟一下除自定义异常外的其他两种异常
    int i = 0;
    i = 5/i;
    return new R().fillData(name);
}

}
在实际开发中可以自定义响应状态码的枚举类和自定义异常以满足需求。

此是spring-boot-route系列的第四篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。本文已收录至我的github,欢迎各位小伙伴star!

github:https://github.com/binzh303/s...

点关注、不迷路
如果觉得文章不错,欢迎关注、点赞、收藏,你们的支持是我创作的动力,感谢大家。

如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。

如果你还想更加深入的了解我,可以微信搜索「Java旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天7:30准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
前端 - 常见的异常捕获方法
前端异常捕获在ES3之前js代码执行的过程中,一旦出现错误,整个js代码都会停止执行,这样就显的代码非常的不健壮。从ES3开始,js也提供了类似的异常处理机制,从而让js代码变的更健壮,程序执行的过程中出现了异常,也可以让程序具有了一部分的异常恢复能力。js异常的特点是,出现不会导致JS引擎崩溃,最多只会终止当前执行的任务。回归正题,我们该如何在程序异常发生
kenx kenx
4年前
SpringBoot优雅的全局异常处理
前言在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服,SpringBoot的项目已经有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot默认的错误处理机制返回错误页面默认返回W
Easter79 Easter79
3年前
springboot2.x如何配置全局自定义异常
为什么要捕获异常?我们开发中,经常运行时,代码会报错,这时候我们有可能抛出异常,而不是用try..catch来解决.而且现在前后端分离,如果不捕获异常的话,前端那边的人估计会被报的错搞得焦头烂额的.springboot2.x是怎么自定义异常的?怎么捕获异常的?我们自定义异常类,需要继承一个RuntimeExceptio
Wesley13 Wesley13
3年前
Java 项目中如何使用异常
1.早抛出,晚捕获.2.如果finally语句中有return语句,则finally中的return语句将会覆盖try中的return语句,如以下代码,将会输出1。如果在finally语句里有抛出异常,那么此异常将会覆盖try块中抛出的异常。publicclassFinallyReturnTest{
Wesley13 Wesley13
3年前
Java中return返回结果的优先级
在Java开发时,异常处理是非常普遍的。先看这样一道关于异常处理的代码publicstaticintgetNumer(){inta1;try{returna;}catch(Exceptione){
Wesley13 Wesley13
3年前
03.Android崩溃Crash库之ExceptionHandler分析
目录总结00.异常处理几个常用api01.UncaughtExceptionHandler02.Java线程处理异常分析03.Android中线程处理异常分析04.为何使用setDefaultUncaughtExceptionHandler前沿上一篇整体介绍了crash崩溃
Stella981 Stella981
3年前
Spring Boot @ControllerAdvice+@ExceptionHandler处理controller异常
需求:  1.springboot 项目restful 风格统一放回json  2.不在controller写trycatch代码块简洁controller层  3.对异常做统一处理,同时处理@Validated校验器注解的异常方法:  @ControllerAdvice注解定义全局异常处理类@ControllerAdvice
Stella981 Stella981
3年前
Python从入门到入土
异常处理tryexcept在Python中,异常处理,主要是tryexcept语句,通常语法格式如下.try:代码块1exceptExceptionase:print(e)代码2try语句按照如下方式工作;首先,执行try子句(在关键字try和关键字except之间的语句)如果没有异常
Easter79 Easter79
3年前
SpringBoot2.0系列教程(五)Springboot框架添加全局异常处理
Hello大家好,本章我们添加全局异常处理。另求各路大神指点,感谢一:为什么需要定义全局异常在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影响二:添加业务类异常在前面说过
Stella981 Stella981
3年前
SpringBoot2.0系列教程(五)Springboot框架添加全局异常处理
Hello大家好,本章我们添加全局异常处理。另求各路大神指点,感谢一:为什么需要定义全局异常在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影响二:添加业务类异常在前面说过
小万哥 小万哥
1年前
Python 异常处理:try、except、else 和 finally 的使用指南
异常处理当发生错误(或我们称之为异常)时,Python通常会停止执行并生成错误消息。try块用于测试一段代码是否存在错误。except块用于处理错误。else块用于在没有错误时执行代码。finally块用于无论try和except块的结果如何都要执行的代码