在实际开发中一般会自定义一些异常,这样对前端是分友好,具体实现如下。
创建一个枚举类,来统一管理所有的自定义异常信息,关于枚举类的一些常用方法及规则后边有记录:
创建枚举类
public enum BusinessExceptionEnum {
USER_LOGIN_NAME_EXIST("用户名称已存在",50001),
USER_LOGIN_CODE_ERROR("验证码错误", 50002),
USER_LOGIN_PASSWORD_ERROR("登录密码错误", 50003),
USER_LOGIN_NAME_ERROR("用户名不正确", 50004);
String name;
int code;
BusinessExceptionEnum(String name, int code) {
this.name = name;
this.code = code;
}
public String getName() {
return name;
}
public int getCode() {
return code;
}
}
创建自定义异常类BusinessException ,这个类必须要继承 RuntimeException类 :
//需要编写一个exception类继承RuntimeException类
public class BusinessException extends RuntimeException{
private int code;
// new BusinessException()时,参数,必须要穿传 BusinessExceptionEnum.xxx
public BusinessException(BusinessExceptionEnum code) {
super(code.getName());
// 当new BusinessException() 时,获取枚举中的code 赋值给 BusinessException 中的code
this.code = code.getCode();
}
public int getCode() {
return code;
}
}
在捕获全局异常类中来添加 BusinessException :
提示:在自定义异常方法上,必须要写@ResponseBody注解,否则自定义异常无效!!!!!!!!!!!!!!
@ControllerAdvice
public class ControllerExceptionHandler {
/**
* 自定义异常处理
* @param e
* @return ComResponse
* BindException 有针对性的对异常类做处理
*/
// 登陆时的自定义异常的处理
@ExceptionHandler(value = {BusinessException.class})
@ResponseBody
public ComResponse loginError(HttpServletRequest request, HttpServletResponse response, BusinessException e) {
ComResponse comResponse = new ComResponse();
comResponse.setMsg(e.getMessage());
comResponse.setCode(e.getCode());
return comResponse;
}
}
测试:
@RestController
@RequestMapping("/category")
public class CategoryController {
@RequestMapping(value = "/t")
public void test() {
throw new BusinessException(BusinessExceptionEnum.USER_LOGIN_NAME_ERROR);
}
}
关于枚举类常用方法:
public enum Enums {
USER_LOGIN_NAME_EXIST("用户名称已存在"),
USER_LOGIN_CODE_ERROR("验证码错误"),
USER_LOGIN_PASSWORD_ERROR("登录密码错误"),
USER_LOGIN_NAME_ERROR("用户名不正确");
String name;
Enums(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(1)枚举类名.常量名.getName( )
获取枚举类中常量的描述,上边name属性对应的就是常量中的描述
public void getTest() {
System.out.println(Enums.USER_LOGIN_CODE_ERROR.getName());
}
(2) 枚举类名.常量名.setName( )
修改常量中的描述。
public void getTest() {
Enums.USER_LOGIN_CODE_ERROR.setName("修改常量描述");
System.out.println(Enums.USER_LOGIN_CODE_ERROR.getName());
}
(3)枚举类名.常量名
返回的是常量名,类型是这个枚举类的类型。
public void getTest() {
System.out.println(Enums.USER_LOGIN_CODE_ERROR);
System.out.println(Enums.USER_LOGIN_CODE_ERROR instanceof Enums);
}