说明:目前接触的是一个纯Java Webservice后台应用项目,虽然之前一直做Java应用的开发;但主要都是基于一些成熟的框架,比如流行的SSH,也有一些公司自己封装的框架;但无论哪种形式,框架本身都提供了很好的验证框架、异常处理机制。而初次接触本框架就是一个不少的挑战,虽然现在回过头来,一切走得还算蛮顺利。在这个项目中的验证和异常处理,我们采用的对Java异常的再次封装;虽然我一直反对验证时采用这种异常机制,因为Java的异常机制很复杂,担心影响性能,但考虑整体的设计结构,目前还是采用这种方式来处理;当然我们也有一套备用方案,这个作为后话了。
【设计原理图】
上图,是异常封装的原理图。ExceptiionConstants:定义的常量类型,包括异常代码和异常信息两部分,然后放在一个Map里;WebException:继承了父类Exception的异常类,构靠传入的异常代码是由ExceptiionConstants提供的;ExceptionOutput:这个异常输出类,比如我们项目中就要求封闭成xml格式输出,它的异常代码是WebException提供的,再根据这个异常代码从ExceptiionConstants的Map里取出异常信息。
【ExceptionConstants代码】
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**常量类型定义*/
public class ExceptionConstants {
public static final String Code_0000 = "0000";
public static final String Msg_0000 = "输入参数不合法!";
public static final String Code_0100 = "0100";
public static final String Msg_0100 = "";
public static final String Code_9999 = "9999";
public static final String Msg_9999 = "其它错误!";
private static Map<String, String> returnCodeMap = new ConcurrentHashMap<String, String>();
public static Map<String, String> getReturnCodeMap() {
if (returnCodeMap.isEmpty()) {
returnCodeMap.put(Code_0000, Msg_0000);
returnCodeMap.put(Code_0100, Msg_0100);
returnCodeMap.put(Code_9999, Msg_9999);
}
return returnCodeMap;
}
【WebException代码】
/**自定义的异常*/
public class WebException extends Exception {
private static final long serialVersionUID = 1L;
private String exceptionCode = "9999";
public WebException() {
super();
}
public WebException(String code) {
super();
if (code != null) {
this.exceptionCode = code;
}
}
public String getExceptionCode() {
return exceptionCode;
}
public void setExceptionCode(String exceptionCode) {
this.exceptionCode = exceptionCode;
}
}
【ExceptionOutput代码】
/**异常封闭输出*/
public class ExceptionOutput {
private String exceptionCode = "9999";
private String execptionMessage = "其它错误";
public ExceptionOutput(String exceptionCode) {
this.exceptionCode = exceptionCode;
this.execptionMessage = ExceptionConstants.getReturnCodeMap().get(
this.exceptionCode);
}
// 封装返回结果,比如封闭成XML等,返回给调用处,这里打印输出一下。
public void toXML() {
System.out.println("Exception:" + this.execptionMessage);
}
【ExcepTest代码】
/**模拟Bean层,处理业务Logic*/
public void ExcA(int i) throws WebException {
if (i < 10) { //抛出一个自定义异常,用来解析判断等处理
throw new WebException(ExceptionConstants.Code_0000);
}
if (i == 10) {//抛出一个运行时异常,系统自动抛出
int j = i / 0;
System.out.println("j="+j);
}
}
/**模拟控制层Controller*/
public static void main(String[] args) throws WebException {
ExcepTest e = new ExcepTest();
try {
e.ExcA(1);
} catch (WebException e1) { //这个异常是捕获我们封装的异常
ExceptionOutput out = new ExceptionOutput(
e1.getExceptionCode());
out.toXML();//写回异常信息给客户端
} catch (Exception ex) {//一般用来捕获运行时异常
ExceptionOutput out = new ExceptionOutput(
ExceptionConstants.Code_9999);
out.toXML(); //写回异常信息给客户端
}
}
总结:由于验证也是由异常抛出的,大家知道java异常处理机制还是蛮复杂的,难免会牺牲一部分性能,在经过性能测试之后会作进一步改正,在设计之初也考虑了另一种方式,将在以后总结出来。