关键字:枚举+自定义异常
适合学习群体:后端开发,Java初学者,面试应聘者。
异常码枚举
先定义一个异常码枚举处理
public enum ErrorCodeEnum {
SYS_ERROR("SYS_ERROR","系统错误,请重写"),
UNKOWN_ERROR("UNKOWN_SYS_ERROR","未知的系统异常"),
SERVICE_INVOKE_FAIL("SERVICE_INVOKE_FAIL", "服务调用失败"),
ILLEGAL_ARGS("ILLEGAL_ARGS", "参数校验错误"),
;
/**
* 结果异常
*/
private String code;
/**
* 描述
*/
private String decs;
ErrorCodeEnum(String code, String decs) {
this.code = code;
this.decs = decs;
}
public static ErrorCodeEnum getByValue(String code){
for (ErrorCodeEnum result : values()) {
if (code.equals(result.getCode())){
return result;
}
}
return null;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDecs() {
return decs;
}
public void setDecs(String decs) {
this.decs = decs;
}
}
一个通过code找枚举的方法
自定义异常
注意有个异常枚举
继承了RuntimeException
/**
* 自定义异常
*/
public class KomaException extends RuntimeException {
private static final long serialVersionUID = -8581672033133636908L;
/*** 错误码枚举*/
private ErrorCodeEnum errorCode;
/**
* 详细错误信息
*/
private Map<String, String> errorMap = new HashMap<String, String>();
/**
* 带参构造器.
*
* @param errorCode
*/
public KomaException(ErrorCodeEnum errorCode) {
super(errorCode.getDecs());
this.setErrorCode(errorCode);
}
/**
* 带参构造器.
*
* @param errorCode
* @param message
*/
public KomaException(ErrorCodeEnum errorCode, String message) {
super(message.isEmpty() ? errorCode.getDecs() : message);
this.setErrorCode(errorCode);
}
/**
* 带参构造器.
*
* @param errorCode
* @param errorMap
*/
public KomaException(ErrorCodeEnum errorCode, Map<String, String> errorMap) {
this(errorCode);
this.errorMap = errorMap;
}
/**
* 带参构造器.
*
* @param message
*/
public KomaException(String message) {
super(message);
this.setErrorCode(ErrorCodeEnum.UNKOWN_ERROR);
}
/**
* Gets error code.
*
* @return the error code
*/
public ErrorCodeEnum getErrorCode() {
return errorCode;
}
/**
* Sets error code.
*
* @param errorCode the error code
*/
public void setErrorCode(ErrorCodeEnum errorCode) {
this.errorCode = errorCode;
}
/**
* Gets error map.
*
* @return the error map
*/
public Map<String, String> getErrorMap() {
return errorMap;
}
/**
* Sets error map.
*
* @param errorMap the error map
*/
public void setErrorMap(Map<String, String> errorMap) {
this.errorMap = errorMap;
}
private static String findMessage(Map<String, String> errorMap) {
if (errorMap.isEmpty()) {
return null;
}
return errorMap.values().iterator().next();
}
}
2个构造方法,还可以增加其他默认构造方法
一个完全根据异常码枚举的、一个是异常码枚举和异常描
测试类
这里的catch可以封装一个resut对象,把异常码、异常描述、成功与否封装进去
public class Test {
public static void main(String[] args) {
String name=null;
int i=0;
try{
if (name==null){
throw new KomaException(ErrorCodeEnum.ILLEGAL_ARGS);
}
if (i==0){
throw new KomaException(ErrorCodeEnum.ILLEGAL_ARGS,"参数不能为0");
}
}catch (KomaException e){
e.printStackTrace();
System.out.println("异常码:"+e.getErrorCode().getCode());
System.out.println("异常描述:"+e.getMessage());
}
}
}
异常码、异常信息都打出来了,定位问题非常方法
总结
定义异常码类就可以,如果业务非常复杂可以把异常码类多搞几个出来
项目中一个异常类够用了,通过不同异常码定义去区分业务异常
强烈建议开发时多定义异常码,越细越好,上了生产方便快速定位BUG
关键枚举异常码+自定义异常