Spring MVC的异常处理非常重要,开发的时候要确保服务器返回给客户端的没有异常,一些未预料到的异常发送到客户端的时候会造成很不好的体验。
这里我们看下Spring的异常处理机制,@ExceptionHandler,@ControllerAdvice
@ExceptionHandler
单独使用@ExceptionHandler时一般写在控制器的内部,在控制器的某个方法上加上@ExceptionHandler注解。
在ExceptionController内部如果抛出了CustomException异常,就会被这个控制器内部的handleError捕捉到。然后进行处理
@Controller
public class ExceptionController {
@ExceptionHandler({CustomException.class})
public String handleError(Exception e){
// ...
// 处理异常
return e.getMessage();
}
}
缺点:
只能作用在特定的控制器,如果每个控制器都添加@ExceptionHandler注解的话,效率太低了。
或者写一个基类的控制器上添加@ExceptionHandler注解,但有时一些控制器已经继承其它的类了,那么还是不够方便。
@ExceptionHandler + @ControllerAdvice
Spring 3.2之后加入了新的@ControllerAdvice注解,可以支持全局的异常处理。这样我们就不用将@ExceptionHandler写的到处都是,只需要集中在一个控制器就可以。
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler({CustomException.class})
public String handleError(Exception e){
// ...
// 处理异常
return e.getMessage();
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleAllException(Exception e){
// 处理异常
// do something
return ResponseEntity.ok(...);
}
}
这种处理方式实际上十分灵活,我们可以根据需要返回自己的类型:
- 返回普通对象
- 返回ResposeEntity的响应
最后
这里我们简单的提了下Spring常用的两个注解处理程序中的异常,还有一个常用的方式是使用HandlerExceptionResolver,这个有兴趣可以自行学习。
网友评论