`
dycsos123ok
  • 浏览: 81498 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 

 

  • 大小: 29.5 KB
分享到:
评论
2 楼 dycsos123ok 2013-09-04  
zwzwzw0a0s 写道
如果异常同时有多个,该怎么解决?

可以分一下层次,多个异常主要是通过日志记载借开发人员参阅处理;对于抛给用户,粒度可以自己控制,如果能分出的可以详细给出,不能分出的,我们程序中一律是以"9999"抛出。
1 楼 zwzwzw0a0s 2013-08-30  
如果异常同时有多个,该怎么解决?

相关推荐

    本科毕业设计项目-Java电影推荐系统-管理后台.zip

    例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不...

    java命名规范 开发规范

    开发一个Action调用关联应用提供的WebService 前置条件:该WebService?WSDL可正常获取 步骤: a. 配置applicationContext-wsclient.xml; Spring管理第三方WebService实例bean Jaxws-client配置代码 b. 生成第三方...

    毕业设计基于Cesium时空数据可视化后台Java SSM框架.zip

    例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不...

    Java开发技术大全(500个源代码).

    HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...

    基于Vue的电影在线预订与管理系统-后台java代码(ssm)(毕业设计).zip

    例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不...

    java范例开发大全

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    Java范例开发大全 (源程序)

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...

    springboot构建后台项目

    可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 诺寒基于hplus和inspinia...

    JavaWeb后台开发框架-其他

    JavaWeb是基于 SpringBoot2+Layui2.5.6+Thymeleaf++Shiro+MybatisPlus 研发的权限(RBAC)及内容管理系统,致力于做更简洁的后台管理框架,包含系统管理、代码生成、权限管理、站点、广告、布局、字段、配置等一系列...

    Java范例开发大全(全书源程序)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    java范例开发大全(pdf&源码)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    java范例开发大全源代码

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...

    基于SpringBoot+Shiro+Redis+Jwt+Thymeleaf+MyBatis 开发的后台用户、角色+源代码+文档

    Geek-Framework是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的**开源**Java微服务快速开发框架。 Geek-Framework是在SpringBoot基础上搭建的一个Java基础开发框架,以Spring MVC为模型视图...

    整理后java开发全套达内学习笔记(含练习)

    Encapsulation[java] 封装 (hiding implementation details) Exception [java] 例外; 异常 [ik'sepʃәn] entry n.登录项, 输入项, 条目['entri] enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, ...

    疯狂JAVA讲义

    1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置PATH环境变量 10 学生提问:为什么...

    java开发oa系统源码下载-role:后台管理系统

    java开发oa系统源码下载 平台简介 一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员...

    java开发oa系统源码下载-YueZi:月子中心管理后台

    java开发oa系统源码下载 平台简介 一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理...

    基于Spring Boot+Apache Shiro+Thymeleaf+MyBatis开发的网站后台权限管理系统.zip

    本系统用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 内置功能 1. 用户...

    java开发oa系统源码下载-OneFish:一条鱼

    java开发oa系统源码下载 平台简介 一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理...

    Java并发编程(学习笔记).xmind

    (3)简化异步事件的处理:服务器应用程序在接受来自多个远程客户端的请求时,如果为每个连接都分配一个线程并且使用同步IO,就会降低开发难度 (4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个...

Global site tag (gtag.js) - Google Analytics