Spring Boot 2.X - Spring Boot全局异常处理

Spring Boot 2.X - Spring Boot全局异常处理

本文简单介绍一下Spring Boot的全局异常处理

原有的异常处理

使用IDEA创建一个Spring Boot项目,先定义一个Controller用于测试:

@RestController
public class TestController {

    @GetMapping("/test")
    public String test(Integer num) {
        int result = 10 / num;
        return "success-" + result;
    }
}

测试接口异常:
打开浏览器访问 http://localhost:8080/test?num=0
在这里插入图片描述
或者是在REST API Testing插件中测试:
在这里插入图片描述
上边暴露的异常信息并不是我们想要的,试想如果别人调用你的接口,甚至你调用别人的接口,返回这样的东西,估计要疯。

当然,我们可以采用try/catch来捕获异常,在service里或者controller里,每个方法捕获,,,代码太过冗余且非常不易维护。

我们采用统一异常处理类去捕获异常并处理,无需controller捕获,并且向用户返回统一规范的响应信息。

全局异常处理

添加依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

异常信息枚举

@Getter
@AllArgsConstructor
@NoArgsConstructor
public enum ExceptionEnum {
    SUCCESS(true,10000,"操作成功!"),
    ZERO_ERROR(false,10001,"除数不能为零!"),
    INVALID_ARGS(false,10002,"缺少参数!"),
    FAIL(false,99999,"系统异常"),
    ;
    private boolean success;
    private int code;
    private String message;
}

自定义异常

自定义一个异常类,用于处理我们已知的特定异常

@Data
public class CustomException extends RuntimeException {
    private static final long serialVersionUID = -4096086160269012865L;
    private ExceptionEnum exceptionEnum;

    public CustomException(ExceptionEnum exceptionEnum) {
        super();
        this.exceptionEnum = exceptionEnum;
    }
}

返回结果类

定义一个结果类,用于统一展示我们返回的信息,包括异常信息

@Data
public class ResponseResult {
    private boolean success;
    private int code;
    private String message;

    public ResponseResult(ExceptionEnum exceptionEnum) {
        this.success = exceptionEnum.isSuccess();
        this.code = exceptionEnum.getCode();
        this.message = exceptionEnum.getMessage();
    }

    public static ResponseResult fail(){
        return new ResponseResult(ExceptionEnum.FAIL);
    }
}

接口修改

修改web接口,对于已知的异常,抛出我们自定义的异常信息

@RestController
public class TestController {

    @GetMapping("/test")
    public String test(Integer num) {
        if (num == null) {
            throw new CustomException(ExceptionEnum.INVALID_ARGS);
        }
        if (num == 0) {
            throw new CustomException(ExceptionEnum.ZERO_ERROR);
        }
        int result = 10 / num;
        return "success-" + result;
    }
}

异常处理器

使用@RestControllerAdvice捕获Controller抛出的异常,@ExceptionHandler统一处理指定的异常

@RestControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseResult customException(CustomException e) {
        return new ResponseResult(e.getExceptionEnum());
    }

    @ExceptionHandler(RuntimeException.class)
    public ResponseResult exception(RuntimeException e) {
        return ResponseResult.fail();
    }
}

测试接口

在这里插入图片描述
在这里插入图片描述
如此,我们就实现了简单的自定义全局异常处理。

原文地址:https://xudc.tech/2019/05/01/spring-boot-2-x-spring-boot-global-exception-handle/

发布了60 篇原创文章 · 获赞 176 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/E09620126/article/details/89737344