说明:
(1.1) 有一个前提,程序中出现的错误(无论是语法错误,还是业务逻辑上的错误),我们都是需要去处理的;而,处理的结果,最终是要反映【Controller给前端,返回的内容】上的;
● 【Controller层中,检查出的问题】和【非Controller层出现的错误】,在业务层面上并没有什么区别,都是错误;
● 只是对于【Controller层中,检查出的问题】,我们可以直接给前端返回对应的ApiRestResponse;(因为MVC设计原则中,Controller层的职责就是和前端打交道的)

自然,为了方便管理,为了快速得到对应的ApiRestResponse对象;对应的错误信息,我们放在了枚举类中:

● 而对于【非Controller层出现的错误】,由于MVC架构所决定的分层职责问题;这种【组织返回给前端对象的工作,也就是组织ApiRestResponse的工作】,不应该由非Controller层(如Service层)来做;一种合适的做法是,采取向上抛异常的策略,来把这个问题反映上去,然后Controller在根据下面抛过来的异常,来组织ApiRestResponse; 同时,又因为本质上来说,【Controller层中,检查出的问题】和【非Controller层出现的错误】,在业务层面上并没有什么区别,其都是错误;所以,对于【非Controller层出现的错误】,为了更方便的构建对应的异常对象,为了方便管理,,对应的错误信息,也可以放在枚举类中;
(1.2) 即, 第一个需要明确的点: 这儿我们定义的异常类,主要是用于【非Controller层出现的错误】;
(1.3)第二个需要明确的点: 我们通过向上抛自定义异常的策略,来把【非Controller层出现的错误】给反映出去;而错误的最终的处理结果,是要反映到【Controller给前端,返回的内容】上的;所以这个自定义异常中的属性,应该按照接口返回信息的格式来定义;(其实,在我们创建ApiRestRespinse统一返回对象,ImoocMallExceptionEnum枚举类的时候,都参照了接口返回信息的格式;;;还好啦,可以理解,毕竟【ApiRestRespinse统一返回对象】、【ImoocMallExceptionEnum枚举类】、【ImoocMallException自定义异常】都是为【Controller给前端,返回的内容】服务的;)这也就是,为什么我们自定义异常类中,定义了code和message两个属性的原因;

(2) 为什么写本篇博客 || 为什么项目需要自定义异常?:
● 在【SpringBoot电商项目用户模块注册接口开发】中,在Service层中遇到了【用户名重复】的情况,而对于这种情况,是需要对外发出【这儿出现了用户名重复】的错误提醒的;
● 又因为,非Controller层出现的错误,不能直接返回(因为“直接返回给前端内容”这件事,是Controller层的职责),而是应该采取向上抛异常的方式来发出提醒;
● 所以,很自然就想到了自定义异常;自定义异常,作为一种【自己定义的警报器】还是很给力的;
所以,应该要明白,对于那些【非Controller层出现的错误】,要想把这个错误信息给提醒出去,向上抛异常是个可以采取的策略;
(3) 有关异常、自定义异常的内容;如果有需要,可以参考【自定义异常】及附近相关文章;
1.编写自定义异常:ImoocMallException;

ImoocMallException自定义异常类:
package com.imooc.mall.exception;
/**
* 描述:自定义、统一异常;
*/
public class ImoocMallException extends Exception {
private final Integer code;
private final String message;
public ImoocMallException(Integer code, String message) {
this.code = code;
this.message = message;
}
public ImoocMallException(ImoocMallExceptionEnum exceptionEnum) {
this(exceptionEnum.getCode(), exceptionEnum.getMsg());
}
public Integer getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}
说明:
(1) 这个自定义异常,没什么好说的; 有关异常、自定义异常的内容;如果有需要,可以参考【自定义异常】及附近相关文章;
(2) 当我们在非Controller层出现错误时,我们可以把对应错误的错误码和错误信息,也定义在ImoocMallExceptionEnum枚举类中;这样一来我们也可以通过枚举类来快速构建对应的异常对象; 还是那句话,【Controller层中,检查出的问题】和【非Controller层出现的错误】,在业务层面上并没有什么区别,都是错误;即,都可以使用ImoocMallExceptionEnum枚举类来管理这些错误信息的错误码和错误信息;而为什么枚举类中要有错误码和错误信息,前面说过,这是根据接口返回的格式来定的;)

(3) 比如, 【SpringBoot电商项目用户模块注册接口开发】中,在Service层中遇到了【用户名重复】的这一错误情况;那么我们就可以在ImoocMallExceptionEnum枚举类中定义对应的错误码和错误信息:

然后,在Service层中,通过定义的这个枚举,来快速创建异常对象,并把这个异常向上抛给Controller层(然后,Controller会根据下面抛过来的异常,来组织相应的ApiRestResponse);这就是后话了,可以参考【SpringBoot电商项目用户模块注册接口开发】中的内容;
