说明:目前接触的是一个纯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异常处理机制还是蛮复杂的,难免会牺牲一部分性能,在经过性能测试之后会作进一步改正,在设计之初也考虑了另一种方式,将在以后总结出来。