一、try/catch异常处理的缺陷
在开发SpringBoot应用时,往往会遇到以下情景:在某个接口中,存在一些可能的异常。比如url参数错误、用户账号和密码错误等。这时我们可以在发生异常的地方抛出我们自定义的异常,并对异常进行处理,就像下面这样:
@RequestMapping("/test") public BosCommonResponse test() { try { //业务代码 throw new BadRequestParameterException(); }catch(BadRequestParameterException e) { //异常处理 } return new BosCommonResponse(); }
然而,这么做的问题是,对于每一种异常,我们都需要编写try/catch语句进行处理。代码因此变的冗长,而且一旦需要修改某种异常,则所有使用了该异常的接口都需要修改。
二、引入全局异常处理
为了解决这一问题,Spring3.2中新增了@ControllerAdvice注解,可以通过该注解配置一个全局异常处理类,它能统一处理Controller中抛出的异常而不需要书写try/catch语句。
三、全局异常处理的使用
1、自定义异常类
public class BadRequestParameterException extends RuntimeException { public BadRequestParameterException() { } public BadRequestParameterException(String msg) { super(msg); } }
注意:自定义异常类必须继承自RuntimeException才可以
2、配置全局异常处理类
@ControllerAdvice public class GlobalExceptionHandler { /** * 处理BadRequestParameterException异常 * */ @ExceptionHandler(value = BadRequestParameterException.class) public BosCommonResponse badRequestParameterException(HttpServletRequest req, BadRequestParameterException e) { return new BosCommonResponse(); } }
3、Controller中遇到异常直接抛出即可
throw new BadRequestParameterException()