SpringBoot实现全局异常处理

1.全局异常处理介绍

1.1 简介

全局异常处理器即把错误异常统一处理的方法,可以在多个地方使用,而不需要为每个地方编写单独的处理逻辑。它可以帮助开发人员更好地管理异常,并提供一致的错误处理方式。

1.2 优点

1.全局异常处理可以提高代码的重用性和可维护性

2.避免重复编写异常处理代码,减少出错的可能性,提高程序的稳定性。

3.配置简单,将代码复制到项目中就可以使用

2.全局异常处理的实现方式

自己定义一个类,在类上添加**@ControllerAdvice** 注解,在方法上添加**@ExceptionHandler**注解,就完成了一个全局异常处理的搭建,在一个类中可以写多个ExceptionHandler,对于不同类型的ExceptionHandler可以拦截不同类型的exception,然后再最后面设置一个拦截Exception.class的拦截器,用于拦截掉所有的方法,如果全局拦截中有我们不想拦截的异常类,只需要捕获以后再从新抛出即可示。

  • @ControllerAdvice设定拦截规则
  • @ExceptionHandler设定拦截的异常类型

3.全局异常处理代码实现

3.1 定义一个统一返回类

@Getter
@Setter
@AllArgsConstructor
public class Results {
    // 返回状态标识
    private Integer code;
    // 返回数据
    private Object data;
    // 返回成功或失败的消息
    private String msg;

    // 成功返回:数据
    public static Results success(Object data) {
        return success(200, data, "");
    }

    // 成功返回:数据、消息
    public static Results success(Object data, String msg) {
        return success(200, data, msg);
    }

    // 成功返回:自定义状态码、数据、消息
    public static Results success(Integer code, Object data, String msg) {
        return new Results(code, data, msg);
    }

    // 失败只返回:消息
    public static Results fail(String msg) {
        return fail(-1, null, msg);
    }

    // 失败返回:数据、消息
    public static Results fail(Object data, String msg) {
        return fail(-1, data, msg);
    }

    // 失败返回:自定义状态码、数据、消息
    public static Results fail(Integer code, Object data, String msg) {
        return new Results(code, data, msg);
    }
}

3.2 定义全局异常处理

@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(value = ArithmeticException.class)
    public Results exceptionHandler(ArithmeticException exception){
        String ExMsg = exception.getMessage();
        log.error(ExMsg);
        if (ExMsg.contains("zero")){
            return Results.fail(ExMsg);
        }
        return Results.fail("未知异常!");
    }

    @ExceptionHandler(Exception.class)
    public Results exceptionHandler1(Exception exception){

        return Results.fail("处理所有异常!发生的错误是:"+exception.getMessage());
    }
}

3.3 制造异常

@Controller
public class BasicController {

    // http://127.0.0.1:8080/hello?name=lisi
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
        int m = 10;
        m = m/0;
        return "Hello " + name;
    }

}

访问网址:http://127.0.0.1:8080/hello?name=lisi

页面结果显示:

SpringBoot实现全局异常处理_第1张图片

4.源代码码云地址

全局异常处理仓库地址

更多内容请查看码云仓库
SpringBoot实现全局异常处理_第2张图片

你可能感兴趣的:(springboot,spring,boot,java,后端)