介绍
对特定的业务错误捕获并返回给前端,比如登录异常。
把一些异常转换为特定异常(自定义异常-异常重抛)抛出,而特定的异常转换成通知信息告诉前端。
在项目异常信息是不能直接返回给用户的,同时也需要返回 vo对象 给前端处理(不管是否成功)。
注解
@ExceptionHandler
用于标注异常处理方法
@ControllerAdvice 和 @RestControllerAdvice
这两个注解都是定义一个全局异常处理类(类似于一个切面),这个类中定义所有的异常处理方法,也可以理解为全局异常通知
注意:这两个注解只能使用其中一个
找到处理特定注解的类的注解
@ControllerAdvice:处理标注 @Controller 注解的类
@RestControllerAdvice:处理标注 @RestController 注解的类
指定需要捕获的包下面所有的类
@RestControllerAdvice("需要捕获的包下面所有的类")
@RestControllerAdvice({"包1","包2"})
案例
不使用异常处理
缺点:不够灵活,每一个方法都需要进行异常处理
@GetMapping("/login")
public ResultVo login(String name, String pass, HttpSession session) {
ResultVo vo = new ResultVo();
try {
User user = loginService.auth(name, pass);
session.setAttribute("user", user);
return vo;
} catch (AuthException e) {
vo.setCode(e.getErrorCode());
vo.setMessage(e.getMessage());
return vo;
} // 捕获其他非业务异常(服务器内部异常)
// 异常捕获是从小到大进行捕获的,
catch (RuntimeException e) {
log.error("服务器内部异常" + e.getMessage());
// 服务器内部错误
vo.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
vo.setMessage("服务器内部异常");
return vo;
}
}
局部异常处理(处理登录业务异常)
@ExceptionHandler 标注的方法专门用于处理请求方法产生的异常,
value属性指定要处理的异常类型
注意:这个局部异常的方法只能在当前 Controller 中有效
@ExceptionHandler
public ResultVo handleAuthException(AuthException e) {
ResultVo vo = new ResultVo();
vo.setCode(e.getErrorCode());
vo.setMessage(e.getMessage());
return vo;
}
全局异常处理类
定义一个全局异常处理类(类似于一个切面)
这个类中定义所有的异常处理方法,也可以理解为全局异常通知
@RestControllerAdvice("top.lldwb.ch09.config")//指定需要捕获的包下面所有的类
@Slf4j
public class ExceptionAdvice {
@ExceptionHandler
public ResultVo handleRuntimeException(RuntimeException e) {
ResultVo vo = new ResultVo();
log.error("服务器内部异常" + e.getMessage());
// 服务器内部错误
vo.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
vo.setMessage("服务器内部异常");
return vo;
}
}