📚目录
- 需求
- 创建抽象类
- 创建业务枚举
- 使用
- 枚举升级
- 简单的方式实现:
- 使用注解方式实现:
需求
后台程序发生异常,通过全局的异常类使用枚举的方式把错误信息返回给前端。
全局异常类处理方式:
改造前使用
改造后使用枚举传递:
创建抽象类
AbstractBaseExceptionEnum
抽象类里面,创建2个抽象方法。
getCode()
: 用于返回错误码getMessage()
:用于返回错误信息
public interface AbstractBaseExceptionEnum {
/**
* 错误码
*/
Integer getCode();
/**
* 错误提示
*/
String getMessage();
}
创建业务枚举
TaokeException
用于返回指定业务错误信息的枚举,我们需要实现AbstractBaseExceptionEnum
抽象接口,因为是抽象方法所以必须要重写里面的2个方法。
在全局异常类ServiceException
中创建构造方法,参数值就是我们的抽象类AbstractBaseExceptionEnum
public ServiceException(AbstractBaseExceptionEnum exceptionEnum)
{
this.message = exceptionEnum.getMessage();
this.code = exceptionEnum.getCode();
}
使用
这样我们在传递错误信息的时候我们就可以通过枚举的形式传递错误,以后我们只需要维护好错误枚举类就好了.
返回给前端:
枚举升级
由于我们的枚举,是跟着业务走的这样就会出现多个异常枚举类,里面的错误码,总不能按照这其他业务里面的错误码进行延伸吧.
如果是多人开发时,我们在本地没提交到master上,我们是不知道其他人有已经把错误码编写到几了.
所以正确的方式是每个错误枚举里面的错误码,只要关乎本错误枚举.格式可以是: model+code
每个错误枚举里面的model
都是唯一的.
简单的方式实现:
简单的方式实现:
返回给前端:
使用注解方式实现:
创建ExpEnumType
注解,用于添加在异常枚举类上.
@Documented
@Target({ElementType.TYPE})//类、接口(包括注释类型)或枚举声明
@Retention(RetentionPolicy.RUNTIME)//注释将由编译器记录在类文件中,并在运行时由VM保留,因此它们可能被反射地读取
public @interface ExpEnumType {
int model() default 99999;
}
然后我们可以通过类的getAnnotation
方法,传递参数ExpEnumType.class
.可以得到该类上的ExpEnumType
的信息.
修改getCode()方法如下:
//该类上必须要有注解ExpEnumType否则会抛空指针异常
ExpEnumType annotation = this.getClass().getAnnotation(ExpEnumType.class);
return Integer.valueOf(annotation.model()+""+this.code);
返回给前端: 效果是一样的