栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

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

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

在开发中,我们经常会使用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 implements Serializable {

    private static final long serialVersionUID = 572235155491705152L;
    
    private int code;
    
    private String message;
    
    private T data;

    
    public R fillCode(int code,String msg){
 this.code = code;
 this.message = msg;
 return this;
    }

    
    public R fillCode(CodeEnum codeEnum){
 this.code = codeEnum.getCode();
 this.message = codeEnum.getMessage();
 return this;
    }

    
    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 {

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

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

    
    @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/spring-boot-route

点关注、不迷路

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

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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号