Spring MVC 异常处理(自定义异常)

Spring MVC 异常处理(自定义异常)

介绍

对特定的业务错误捕获并返回给前端,比如登录异常。
把一些异常转换为特定异常(自定义异常-异常重抛)抛出,而特定的异常转换成通知信息告诉前端。
在项目异常信息是不能直接返回给用户的,同时也需要返回 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;
    }
}