当前位置 博文首页 > blackball1998的博客:全局异常处理
在一个项目中,我们希望在发生一些异常时,如果在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属性,则不会返回视图或是数据,只会返回默认错误页面