在每个公司的架构中,日志肯定是重点,以至于很多时候需要对日志进行优化!
那么该怎么设计,怎么定义自己想提示出的自定义消息呢,下面就是一个很好的设计示例,以供参考!
本文采取从上到下的模式用代码设计:
1. 自定义异常根类:
/**
* 公司的运行时异常根类。【这个类可以打进jar包,供全公司使用】
*
* <p>
* 统一异常层次,便于处理与监控。
*
* @author
*
*/
public class CompanyRuntimeException extends RuntimeException {
/** serialVersionUID */
private static final long serialVersionUID = 0L;
/** 严重级别 */
protected int severity = CompanyExceptionSeverity.NORMAL;
/**
* 空构造器。
*/
public CompanyRuntimeException() {
super();
}
/**
* 构造器。
*
* @param severity 严重级别
*/
public CompanyRuntimeException(int severity) {
super();
this.severity = severity;
}
/**
* 构造器。
*
* @param message 消息
*/
public CompanyRuntimeException(String message) {
super(message);
}
/**
* 构造器。
*
* @param message 消息
* @param severity 严重级别
*/
public CompanyRuntimeException(String message, int severity) {
super(message);
this.severity = severity;
}
/**
* 构造器。
*
* @param cause 原因
*/
public CompanyRuntimeException(Throwable cause) {
super(cause);
}
/**
* 构造器。
*
* @param cause 原因
* @param severity 严重级别
*/
public CompanyRuntimeException(Throwable cause, int severity) {
super(cause);
this.severity = severity;
}
/**
* 构造器。
*
* @param message 消息
* @param cause 原因
*/
public CompanyRuntimeException(String message, Throwable cause) {
super(message, cause);
}
/**
* 构造器。
*
* @param message 消息
* @param cause 原因
* @param severity 严重级别
*/
public CompanyRuntimeException(String message, Throwable cause, int severity) {
super(message, cause);
this.severity = severity;
}
/**
* @return Returns the severity.
*/
public int getSeverity() {
return severity;
}
/**
* @see java.lang.Throwable#toString()
*/
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append(super.toString()).append(" - severity: ");
switch (severity) {
case CompanyExceptionSeverity.MINOR:
buffer.append("MINOR");
break;
case CompanyExceptionSeverity.NORMAL:
buffer.append("NORMAL");
break;
case CompanyExceptionSeverity.MAJOR:
buffer.append("MAJOR");
break;
case CompanyExceptionSeverity.CRITICAL:
buffer.append("CRITICAL");
break;
default:
buffer.append("UNKNOWN");
}
buffer.append("(").append(severity).append(")");
return buffer.toString();
}
}
异常级别分类:
/**
* 异常严重级别常量。
*
* @author
*
* @version
*/
public interface CompanyExceptionSeverity {
/** 轻微 */
int MINOR = 1;
/** 一般 */
int NORMAL = 2;
/** 重要 */
int MAJOR = 3;
/** 严重 */
int CRITICAL = 4;
}
2. 每个业务的自定义异常类,例如MyPayException【自定义的测试业务】
/**
* 自定义系统运行时异常
*
* @author
* @version
*/
public class MyPayException extends CompanyRuntimeException {
/** serialVersionUID */
private static final long serialVersionUID = 0L;
/** 返回码 */
private MyPayResultCodeEnum resultCode;
/**
* 构造函数
*
* @param resultCode 返回码
*/
public MyPayException(MyPayResultCodeEnum resultCode) {
super();
this.resultCode = resultCode;
}
/**
* 构造函数
*
* @param resultCode 返回码
* @param e 需要传递的异常
*/
public MyPayException(MyPayResultCodeEnum resultCode, Throwable e) {
super(e);
this.resultCode = resultCode;
}
/**
* 构造函数
*
* @param resultCode 返回码
* @param message 错误信息
*/
public MyPayException(MyPayResultCodeEnum resultCode, String message) {
super(message);
this.resultCode = resultCode;
}
@Override
public String toString() {//ToStringBuilder ToStringStyle所属于commons-lang jar包
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
/*
* getter and setter
*/
public MyPayResultCodeEnum getResultCode() {
return resultCode;
}
public void setResultCode(MyPayResultCodeEnum resultCode) {
this.resultCode = resultCode;
}
}
3.业务异常信息枚举
/**
* 自定义业务操作返回码枚举
*
* @author
* @version $
*/
public enum MyPayResultCodeEnum {
/** 操作成功 */
SUCCESS("SUCCESS", "操作成功"),
/** 系统错误 */
SYSTEM_FAILURE("SYSTEM_FAILURE", "系统错误"),
/** 参数为空 */
NULL_ARGUMENT("NULL_ARGUMENT", "参数为空"),
/** 参数不正确 */
ILLEGAL_ARGUMENT("ILLEGAL_ARGUMENT", "参数不正确"),
/** 邮箱非法 */
EMAIL_ILLEGAL("EMAIL_ILLEGAL", "邮箱非法")
;
/** 枚举值 */
private String value;
/** 枚举信息 */
private String message;
private MyPayResultCodeEnum(String value, String message) {
this.value = value;
this.message = message;
}
/**
* 根据枚举值获取枚举对象,如果找不到对应的枚举返回<code>null</code>
*
* @param value 枚举值
* @return 枚举对象
*/
public static MyPayResultCodeEnum getEnumByValue(String value) {
for (MyPayResultCodeEnum resultCode : MyPayResultCodeEnum.values()) {
if (resultCode.getValue().equals(value)) {
return resultCode;
}
}
return null;
}
/*
* getter
*/
public String getValue() {
return value;
}
public String getMessage() {
return message;
}
}
4.业务执行捕获异常
public <T> T execute(){
MyPayResult retResult = new MyPayResult();
try {
// 1.业务校验
// 2.业务执行
// 3.异常处理
} catch (MyPayException e) {
retResult.setSuccess(false);
retResult.setResultCode(e.getResultCode());
retResult.setMessage(StringUtil.isNotBlank(e.getMessage()) ? e.getMessage() : e
.getResultCode().getMessage());
logger.warn("业务异常," + e.getResultCode().getMessage(), e);
}
return (T)retResult;
}
5.第4中的返回值定义,以供调用端判断是否执行成功还是失败:
import java.io.Serializable;
/**
* 订购中心业务处理结果
*
* @author
* @version
*/
public class MyPayResult implements Serializable {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
/** 成功标志 */
protected boolean success;
/** 返回码 */
private MyPayResultCodeEnum resultCode;
/** 返回信息 */
protected String message;
/**
* 构造函数,默认返回码为“SUCCESS”。
*/
public MyPayResult() {
resultCode = MyPayResultCodeEnum.SUCCESS;
this.message = resultCode.getMessage();
success = true;
}
/**
* 构造函数
*
* @param success 成功标志
*/
public MyPayResult(boolean success) {
this.success = success;
this.resultCode = MyPayResultCodeEnum.SYSTEM_FAILURE;
this.message = resultCode.getMessage();
}
/**
* 构造函数
*
* @param resultCode 返回码
*/
public MyPayResult(MyPayResultCodeEnum resultCode) {
success = resultCode == MyPayResultCodeEnum.SUCCESS;
this.resultCode = resultCode;
this.message = resultCode.getMessage();
}
/**
* 构造函数
*
* @param resultCode 返回码
*/
public MyPayResult(boolean success, MyPayResultCodeEnum resultCode) {
this.success = success;
this.resultCode = resultCode;
this.message = resultCode.getMessage();
}
/**
* 返回结果信息
*
* @return 如果resultCode存在,返回resultCode的message,否则返回result中的message字段
*/
public String findMessage() {
return StringUtil.isNotBlank(message) ? message : resultCode.getMessage();
}
/*
* getters and setters
*/
/**
* Getter method for property <tt>success</tt>.
*
* @return property value of success
*/
public boolean isSuccess() {
return success;
}
/**
* Setter method for property <tt>success</tt>.
*
* @param success value to be assigned to property success
*/
public void setSuccess(boolean success) {
this.success = success;
}
/**
* Getter method for property <tt>resultCode</tt>.
*
* @return property value of resultCode
*/
public MyPayResultCodeEnum getResultCode() {
return resultCode;
}
/**
* Setter method for property <tt>resultCode</tt>.
*
* @param resultCode value to be assigned to property resultCode
*/
public void setResultCode(MyPayResultCodeEnum resultCode) {
this.resultCode = resultCode;
}
/**
* Getter method for property <tt>message</tt>.
*
* @return property value of message
*/
public String getMessage() {
return message;
}
/**
* Setter method for property <tt>message</tt>.
*
* @param message value to be assigned to property message
*/
public void setMessage(String message) {
this.message = message;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
6.使用范例:校验邮箱是否合法(可以放到工具类util)
/** Email验证正则表达式 */
private static final String REGEX_EMAIL = "^(([_\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([_\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?))$";
/**
* 验证邮件地址格式
*
* @param email 字符串
* @param message 错误信息
* @exception MyPayException 如果邮件格式不正确
*/
public static void notEmail(String email, String message) {
if (!StringUtil.isEmpty(email) && !Pattern.compile(REGEX_EMAIL).matcher(email).find()) {
throw new MyPayException(MyPayResultCodeEnum.EMAIL_ILLEGAL, message);
}
}
以上,设计有需要改进的地方,欢迎探讨!!!!