- 浏览: 124468 次
- 性别:
- 来自: 北京
最新评论
-
ynlxc:
亲,关注你的书4个月了,真是等到花儿也谢了。。。可否发些试读章 ...
《流程的永恒之道-一个工作流与BPM项目的备战培训及实施记》之目录结构 -
heguojun:
songjingjing520 写道[flash=200,20 ...
spring中使用mule的配置经验总结 -
songjingjing520:
[flash=200,200][/flash][url][/u ...
spring中使用mule的配置经验总结 -
chengguogen:
jbpm jpdl task-> form 只能写死 不 ...
应用jBPM4解决中国特色的流程需求 -
guofengcn:
这本书出版了吗?
《Head First Process-深入浅出流程》连载
在一个framework的设计中,异常框架的设计占据着很重要的位置,因为它会直接影响到整个应用的健壮性、稳定性和易用性,因此笔者结合自己在产品开发中的经验给出了一个异常框架的设计及实现与大家共享,有考虑不周或欠妥的地方还望大家一起讨论,共同提高。
异常框架的总体结构图
11.1异常框架总体结构图
如上图所示,
java
平台框架的异常机制包括程序异常及业务异常。对于程序异常和业务异常我们设计一个
BaseException
基类,
BaseException
是一个
unchecked exception
(即继承于
RuntimeException
),
javaeye
上有一篇关于
checked exception
和
unchecked exception
的讨论长达几十页,偶在此就不多做解释了,基于此平台框架进行开发的应用可以对
BaseException
进行派生,例如
BizFocus-workflow
封装了
PersistenceException
和
ServiceException
来对应于持久层异常和业务层异常。持久层和业务层的异常在捕获之后通过
log4j
输出到了程序日志,然后继续向外抛给展现层的
Action
控制类,
Action
不需要对异常进行捕获,因为
BizFocus-workflow
提供了一个基于
webwork
的异常拦截器(
ExceptionInterceptor
)对所有的
Action
的异常进行拦截。拦截后不同的异常在异常的国际化文件中取得异常提示信息展示给最终用户。
1.2.1
异常信息的国际化封装
如图
1.1
所示,异常信息的国际化封装主要由
Messages
接口及其实现类
MessageImpl
和
Message_CN.properties
、
Message.properties
两个国际化文件组成。
Messages
接口如下:
public interface Messages {
public static final int ERROR_UNKNOWN = 0;
public static final int ERROR_SYSTEM = 1;
public static final int ERROR_WORKFLOW = 2;
public static final int NO_DECISIONVALUE_SET = 3;
………//
其它的异常代码
}
MessageImpl
实现类的代码如下:
public class MessageImpl implements Messages {
public MessageImpl() {
}
public static String getFormattedMessage(int i, Object aobj[]) {
String s;
try {
s = bundle.getString(String.valueOf(i));
if (aobj != null)
s = MessageFormat.format(s, aobj);
}
catch (MissingResourceException missingresourceexception) {
s = missingresourceexception.getMessage();
}
return s;
}
private static ResourceBundle bundle = ResourceBundle.getBundle("com.xxx.common.MessagesCN");
Message.properties
国际化文件如下:
0 = Unknown error
1 = System error
2 = Workflow error
3 = No decision vlaue was set
……
其它异常信息
Message_CN.properties
文件内容如下:
0 =
未知的错误
1 =
系统错误
2 =
工作流错误
3 =
您没有设置工作流分支节点的决策值
……
其它异常信息
1.2.2
业务层和持久层异常的国际化处理
对于业务层和持久层异常的处理可以按照如下方式进行:
try {
//
业务逻辑代码
……
} catch (XXXException ex) {
if (log.isDebugEnabled())//
如果是
debug
状态,直接输出异常的堆栈调用顺序
ex.printStackTrace();
else//
不是
debug
状态,则只输出异常信息到日志文件
log.error(BaseException.getLocalizedMessage(Messages.ERROR_WORKFLOWENGINE, null), ex);
throw new ServiceException(ex);//
最后将异常抛给外层
}
1.2.3
展现层异常的国际化处理
持久层和业务层的异常首先抛给了展现层的
Action
,在
Action
中对
Exception
不做任何处理直接抛出,例如
Action
的代码如下:
public String execute() throws Exception {//
将
Exception
直接抛出
//
控制逻辑的代码
……
}
在上一节中,
Action
将
Exception
直接抛出,因此在
webwork
拦截器中,对
Exception
进行拦截,将拦截的
Exception
进行分类,根据分类取得相关的异常提示信息,然后传给统一的异常显示页面,用户在异常页面上就会看到不同的异常信息。
ExceptionInterceptor
代码示例如下:
public class ExceptionInterceptor implements Interceptor {
private static final Log log = LogFactory.getLog(ExceptionInterceptor.class);
public static final String EXCEPTION = "exception";
public void destroy() {
//To change body of implemented methods use File | Settings | File Templates.
}
public void init() {
//To change body of implemented methods use File | Settings | File Templates.
}
public String intercept(ActionInvocation invocation) throws Exception {
String tipMessge = null;//
中文提示信息
String detailMessage = null;//
详细的错误信息
try {
return invocation.invoke();
} catch (Exception e) {
if (e instanceof PersistenceException){//
判断程序异常的类型
//
从国际化文件中取得相应的错误提示信息
tipMessge = ErrorMessage.getLocalizedMessage(Messages.ERROR_PERSISTENCELAYER);
}else if(e instanceof ServiceException){//
判断程序异常的类型
tipMessge = ErrorMessage.getLocalizedMessage(Messages.ERROR_SERVICELAYER);
}
//
详细的错误信息栈
detailMessage = invocation.getAction();
return EXCEPTION;//webwork
将导向
EXCEPTION
对应的错误信息页面,
common/exception.ftl
}
}
}
上述代码是一个比较详细的异常拦截器的代码,业务端可以基于此拦截器进行继承,然后就可以很详细地定制自己在开发过程中的异常。
common/exception.ftl
页面的代码如下:
<table align="left" class="common_input_table" style="width:100%;height:100%">
<tr>
<td align="center" class="common_td_lable">${action.getText('bizfocus.ui.errorPageTitle')}</td>
</tr>
<tr>
<td align="center" class="common_td_text" >
<div align="center">
<br><br><br><br>
<@ww.if test="errorMessage==null">
` <font color="red">${action.getText('bizfocus.ui.errormessage')}</font>
</@ww.if>
<@ww.else>
<a href=”detailMessage.action?detailMessage=<@ww.property value=’detailMessage’/>”> <font color="red"><@ww.property value="tipMessage"/></font>
</@ww.else>
</div>
</td>
</tr>
</table>
1.3
业务异常的扩展
1.3.1Exception
的继承机制
业务异常的处理,是在开发过程中经常遇到的问题,例如工作流引擎提供的根据业务数据自动决策分支节点的路由功能中,如果业务数据没有传递给工作流引擎,则应该抛出一个没有设置决策数据的业务异常
(NoDecisionValueSetException)
,因此在开发业务的过程中,开发者可以根据实际的业务情况进行异常类的定制开发,最后这些业务异常同样被开发者自己扩展的异常拦截器进行拦截,最后根据业务异常的种类将不同的业务异常提示信息展示给最终用户(例如:
“
您没有设置决策数据给工作流引擎
”
)。
发表评论
-
关于clone的问题
2007-07-24 20:58 853偶今天真是郁闷呀,在 ... -
自己基于spring和hibernate封装的framework
2007-07-24 21:03 985这两个月一直忙于写工作流论文的事,所以也没有记什么东西,上一周 ... -
applet的运行
2007-07-24 21:12 844applet在浏览器中运行时,首先由jre负责将applet及 ... -
java变量
2007-07-24 21:18 1028类中有几种变量,分别是:局部变量(英文可以为:local\au ... -
mule中协议服务的查找
2007-07-24 21:20 832在mule中提供了tcp、vm、http、soap、jms、u ... -
基于Spring、hibernate、webwork的工作流终于推出了
2007-07-24 21:23 1075前段时间一直在忙于工作流的改版,经过将3个多月的努力,公司基于 ... -
EAI深层解析之我见
2007-07-25 23:41 1203EAI深层解析之我见 1、 EAI概念概述 早期EAI是相对狭 ... -
SCA、JBI之比较
2007-07-26 00:35 2335SCA最早是由IBM、BEA、Oracle、SAP四大家发起的 ... -
基于webwork和过滤器实现无代码侵入的原子级界面权限
2007-07-29 22:53 746在我们开发产品或项目 ... -
参加IBM SCA技术培训有感
2007-08-27 16:46 1047周六去参加了IBM的技术 ... -
实现xwork配置文件的自动加载
2008-03-25 23:09 1519本公司的业务开发平台 ... -
AIX+weblogic性能诊断记录1
2008-07-24 13:41 1929公司的产品在一个大集中式的项目中,上线试运行的过程中,性能一直 ... -
由于Spring的单态引起的线程阻塞的问题
2008-09-13 10:05 1925线程阻塞的问题 关键字:Spring, 单例,同步,线程 ... -
EJB的HOME接口的高速缓存
2007-04-29 11:25 1903EJB的HOME接口的高速缓存- - 公司的platform ... -
又发现了一个ESB的产品
2005-03-04 10:29 961Artix是一系列高性能Web 服务集成产品,它使企业能够使用 ... -
static块的执行
2005-03-15 11:02 993今天在javaeye上看到的一个帖子,摘引如下:"j ... -
J2EE的模块化部署
2005-03-16 15:26 1896下面的文章转帖自http://www.it315.org/ar ... -
spring中使用mule的配置经验总结
2005-09-23 17:38 5802在spring中使用mule时,有两种主要的方式,一种是将mu ... -
mule中协议服务的查找
2005-09-23 17:38 1413在mule中提供了tcp、vm、http、soap、jms、u ... -
郁闷死的axis集成问题
2005-09-27 23:00 1184在自己的webapp中集成axis时,始终出现:Process ...
相关推荐
Java平台统一异常框架归类.pdf
要实现全局异常统一处理,Java提供了多种机制,包括Java的异常处理机制、AOP(面向切面编程)等。其中,使用Java异常处理机制实现全局异常统一处理是最常见的方式。 在Java异常处理机制中,当一个方法抛出异常时,...
# OnlineExamSystem 基于SSM框架开发的一款在线考试系统 项目简介: 前端框架使用的主要是easyui和jquery 后端框架使用的主要是Spring、SpringMVC、...使用SpringMVC提供的全局异常处理器进行统一异常处理。
统一异常处理会区分前端是否ajax请求,自动返回json数据格式,要求开发人员在处理ajax请求时统一封装成一个对象返回,以符合代码统一规范。 此工程在idea环境编写,导入请自己新建工程手工复制代码导入。
主要功能: ... ... 根据课程类型随机抽取数据库中的考试题库并显示试题 在考试过程中会有计时功能,时间到了之后自动交卷 在考生提交试卷后实现自动阅卷功能,并...使用SpringMVC提供的全局异常处理器进行统一异常处理。
Java EE常用框架 WebService 介绍 基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用 术语 XML. Extensible Markup Language -扩展性标记语言 WSDL – ...
为了帮助大家更好地完成毕业设计,我们特地整理了一系列Java毕业设计项目参考资源,包括源代码、MD文档、笔记等等,希望能对您的学习与研究提供有力支持。 项目源代码:涵盖了多个Java毕业设计项目的完整代码,包括...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
13.1.1统一的数据访问异常 260 13.1.2通用的数据访问模板及抽象支持类 261 13.2spring的jdbc 262 13.2.1为什么需要jdbctemplate 262 13.2.2通过jdbcdaosupport使用jdbctemplate 263 13.2.3jdbctemplate提供的...
还拥有多数据源、数据权限、Swagger支持、Redis缓存动态开启与关闭、统一异常处理、多模块、云存储、代码生成器等技术特点 技术选型 · 核心框架:Spring Boot 2.0.2 · 安全框架:Apache Shiro 1.4 · 视图...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
还拥有多数据源、数据权限、Swagger支持、Redis缓存动态开启与关闭、统一异常处理、多模块、云存储、代码生成器等技术特点 技术选型 · 核心框架:Spring Boot 2.0.2 · 安全框架:Apache Shiro 1.4 · 视图...