读书人

Java应用后台开发设计之错误封装(一)

发布时间: 2012-12-22 12:05:06 作者: rapoo

Java应用后台开发设计之异常封装(一)

说明:目前接触的是一个纯Java Webservice后台应用项目,虽然之前一直做Java应用的开发;但主要都是基于一些成熟的框架,比如流行的SSH,也有一些公司自己封装的框架;但无论哪种形式,框架本身都提供了很好的验证框架、异常处理机制。而初次接触本框架就是一个不少的挑战,虽然现在回过头来,一切走得还算蛮顺利。在这个项目中的验证和异常处理,我们采用的对Java异常的再次封装;虽然我一直反对验证时采用这种异常机制,因为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异常处理机制还是蛮复杂的,难免会牺牲一部分性能,在经过性能测试之后会作进一步改正,在设计之初也考虑了另一种方式,将在以后总结出来。

?

?

读书人网 >编程

热点推荐