当前位置 博文首页 > blackball1998的博客:全局异常处理

    blackball1998的博客:全局异常处理

    作者:[db:作者] 时间:2021-06-19 19:53

    全局异常处理

    在一个项目中,我们希望在发生一些异常时,如果在service层没有对异常进行捕获处理,则在返回给前端时可以做一个统一的异常捕获处理,这时候可以用Spring MVC为我们提供的全局异常处理机制

    异常处理器

    创建一个异常处理器,需要两个注解@ControllerAdvice@ExceptionHandler,首先我们将@ControllerAdvice注解添加在我们自定义的异常处理器中

    @ControllerAdvice
    public class GlobalExceptionHandler {
    }
    

    这个注解使得异常处理器在捕获异常时,返回一个视图

    然后在视图处理器中添加异常处理方法,在方法上添加@ExceptionHandler注解,在注解中绑定需要捕获的异常的class类,这样如果发生的绑定的异常,则会执行异常处理方法中的逻辑,并返回一个视图,如示例中,当发生RuntimeException异常时返回一个index.html的页面

    @ExceptionHandler注解绑定异常的属性是一个数组类型,我们可以使用数组的写法绑定多个异常

    捕获异常并对异常进行处理,如打印异常信息,可以将一个Exception对象作为参数添加到异常处理方法的参数列表中

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(RuntimeException.class)
        public String handleRunTimeException(Exception e) {
            System.out.println(e.getMessage());
            return "index.html";
        }
    }
    

    创建一个会产生RuntimeException异常的Controller用于测试

    @RestController
    public class MyController {
    
        @RequestMapping("/test")
        public String test() {
            throw new RuntimeException("测试错误");
        }
    }
    

    测试结果可以看到,在发生异常时,异常被异常处理器捕获,在后台打印了异常信息,并返回了一个视图

    在这里插入图片描述

    在这里插入图片描述

    如果不希望返回一个视图,而是返回数据,如JSON字符串,则使用@RestControllerAdvice注解代替@ControllerAdvice注解,或者使用@ResponseBody注解

    设置相应状态码

    当发生异常时,我们需要对相应设置一个状态码,可以使用@ResponseStatus注解实现,这个注解可以标注在异常处理器中的异常处理方法上,也可以标注在我们自定义的异常上

    在异常处理方法上使用

    在异常处理方法上添加@ResponseStatus注解,当异常处理方法捕获到异常时,响应的状态码会设置的成注解中设置的状态码

    @ControllerAdvice
    public class GlobalExceptionHandler {
        
        @ResponseStatus(HttpStatus.FORBIDDEN)
        @ExceptionHandler(RuntimeException.class)
        public String handleRunTimeException(Exception e) {
            System.out.println(e.getMessage());
            return "index.html";
        }
    }
    

    在这里插入图片描述

    @ResponseStatus注解也可以在普通的请求处理方法上,或者异常处理器的类上添加,也是同样的效果

    在自定义的异常上使用

    我们可以自定义一个异常,然后在异常类上添加@ResponseStatus注解,这样如果发生了这个异常,响应的状态码就会是我们设置的状态码

    @ResponseStatus(HttpStatus.FORBIDDEN)
    public class MyException extends RuntimeException {
    
        public MyException(String message) {
            super(message);
        }
    }
    

    创建一个会抛出我们自定义异常的Controller用于测试

    @RestController
    public class MyController {
    
        @RequestMapping("/test")
        public String test() {
            throw new MyException("测试错误");
        }
    }
    

    测试结果

    在这里插入图片描述

    注意一般不要设置@ResponseStatus注解的reason属性,如果设置了reason属性,则不会返回视图或是数据,只会返回默认错误页面

    下一篇:没有了