Java异常体系很庞大(eclipse,选中Exception,按下ctrl+T可看到),在实际运用中,我们会根据需要定义自己的异常。每个自定义异常一般从名字上就能看出所要表达的类型,比如业务异常BusinessException,任务异常JobException等。异常类的主要属性一般是异常号码和异常信息参数;其中异常号码应全局唯一,通过该号码可找到对应的异常信息(异常号码和异常信息的映射可配置到properties、xml文件,枚举类或是存储到数据库,异常信息可带有占位符);而异常信息参数在运行时传入,按顺序替换异常信息中的占位符,生成最终提示信息。
?
自定义异常如下:
?
@SuppressWarnings("serial")
public class DemoException extends Exception {
?
private String exceptionNo;// 异常号码,全局唯一
private Object[] placeHolderParams = new Object[0];// 异常信息参数,按顺序替换异常信息中的占位符
?
public DemoException(String exceptionNo) {
this.exceptionNo = exceptionNo;
}
?
public DemoException(String exceptionNo, Throwable cause) {
super(cause);
this.exceptionNo = exceptionNo;
}
?
public DemoException(String exceptionNo, Object... placeHolderParams) {
this(exceptionNo);
this.placeHolderParams = placeHolderParams;
}
?
public DemoException(String exceptionNo, Throwable cause, Object... placeHolderParams) {
this(exceptionNo, cause);
this.placeHolderParams = placeHolderParams;
}
?
@Override
public String getMessage() {
return ExceptionHelper.format(this.exceptionNo, this.placeHolderParams);
}
?
@Override
public String toString() {
return this.getMessage();
}
?
}
?
这里为方便,直接使用枚举类存放异常号码和异常信息。
?
import java.text.MessageFormat;
?
public enum ExceptionHelper {
?
DEMO_EXCEPTION("888888", "发送异常了,占位符1是[{0}],,占位符2是[{1}]")
// TODO 根据需要添加
;
?
private String exceptionNo;// 异常号码,全局唯一
private String exceptionMessage;// 异常信息,可添加占位符
?
private ExceptionHelper(String exceptionNo, String exceptionMessage) {
this.exceptionNo = exceptionNo;
this.exceptionMessage = exceptionMessage;
}
?
public String getExceptionNo() {
return this.exceptionNo;
}
?
public String getExceptionMessage() {
return this.exceptionMessage;
}
?
/**
* 根据异常号码获取原始异常信息
*?
* @param exceptionNo
* @return
*/
public static String getErrorMessage(String exceptionNo) {
for (ExceptionHelper ee : values()) {
if (ee.getExceptionNo().equals(exceptionNo)) {
return ee.getExceptionMessage();
}
}
return null;
}
?
/**
* 格式化异常信息并返回最终显示信息
*?
* @param exceptionNo
* @param placeHolderParams
* @return
*/
public static String format(String exceptionNo, Object... placeHolderParams) {
return MessageFormat.format(getErrorMessage(exceptionNo), placeHolderParams);
}
?
}
?
然后在捕获到DemoException后,调用方法getMessage或toString即可获取到要显示的消息。
上面的代码没有把异常号码显示在信息中,如需要显示在最前面,可修改成下面:
public static String format(String exceptionNo, Object... placeHolderParams) {
return "[" + exceptionNo + "]" + MessageFormat.format(getErrorMessage(exceptionNo), placeHolderParams);
?
}
?
另外就是如果我们使用了properties、xml文件,或是数据库存放,相应的也要进行改造,主要是获取原始信息和格式化后显示,这里只提供一种思路。
?
?