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

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值