`

java平台统一异常框架的设计与实现

阅读更多

在一个framework的设计中,异常框架的设计占据着很重要的位置,因为它会直接影响到整个应用的健壮性、稳定性和易用性,因此笔者结合自己在产品开发中的经验给出了一个异常框架的设计及实现与大家共享,有考虑不周或欠妥的地方还望大家一起讨论,共同提高。

 
1.1 Java异常框架总体设计
异常框架的总体结构图
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.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直接抛出
       //控制逻辑的代码……
}
1.2.4通过webwork拦截器实现异常信息在界面的展示
在上一节中,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),因此在开发业务的过程中,开发者可以根据实际的业务情况进行异常类的定制开发,最后这些业务异常同样被开发者自己扩展的异常拦截器进行拦截,最后根据业务异常的种类将不同的业务异常提示信息展示给最终用户(例如:“您没有设置决策数据给工作流引擎”)。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/snow_fox_yaya/archive/2007/10/13/1823205.aspx

分享到:
评论

相关推荐

    Java平台统一异常框架归类.pdf

    总的来说,Java平台的统一异常框架设计旨在提供一个健壮、稳定且易于使用的异常处理机制,它通过异常的层次结构、国际化和拦截器,有效地管理和呈现应用程序可能出现的各种异常情况,提高了系统的可维护性和用户体验...

    java全局异常统一处理

    要实现全局异常统一处理,Java提供了多种机制,包括Java的异常处理机制、AOP(面向切面编程)等。其中,使用Java异常处理机制实现全局异常统一处理是最常见的方式。 在Java异常处理机制中,当一个方法抛出异常时,...

    基于Java web的SSM框架的在线考试系统设计与实现(源码+数据库).zip

    # OnlineExamSystem 基于SSM框架开发的一款在线考试系统 项目简介: 前端框架使用的主要是easyui和jquery 后端框架使用的主要是Spring、SpringMVC、...使用SpringMVC提供的全局异常处理器进行统一异常处理。

    基于java任务发布接收平台设计与实现.docx

    《基于Java任务发布接收平台设计与实现》 在信息技术飞速发展的今天,企业对高效的任务管理和协作需求日益增强。基于Java的任务发布接收平台应运而生,它旨在提供一个便捷、安全、可扩展的环境,使得任务的发布、...

    java图书管理系统的设计与实现(源代码+毕设).zip

    Java图书管理系统的设计与实现是一个典型的企业级应用项目,它涵盖了软件工程中的多个重要知识点,包括系统分析、设计、编码和测试等阶段。本系统主要基于Java编程语言,结合SQL数据库技术,为用户提供了一套完整的...

    spingmvc+mybatis+统一异常处理机制

    统一异常处理会区分前端是否ajax请求,自动返回json数据格式,要求开发人员在处理ajax请求时统一封装成一个对象返回,以符合代码统一规范。 此工程在idea环境编写,导入请自己新建工程手工复制代码导入。

    java 框架论坛系统

    Java框架论坛系统是一种基于Java技术实现的在线讨论平台,它主要利用了Struts框架进行构建。Struts是Apache软件基金会下的一个开源项目,是MVC(Model-View-Controller)设计模式的一种实现,广泛应用于Java Web开发...

    Java Application Service Java 应用服务框架

    7. **异常处理**:框架提供了统一的异常处理机制,可以捕获并处理各种运行时异常,确保程序的健壮性。 8. **持续集成与部署**:配合Jenkins、GitLab CI/CD等工具,可以实现自动化构建、测试和部署,加快软件交付...

    Java-SpringMVC-毕业设计-源代码

    10. **异常处理**:项目会包含统一的异常处理机制,确保在出现错误时,能够提供友好的错误提示,而不是直接暴露系统错误信息。 11. **安全性**:考虑到实际应用,项目可能实现了用户认证与授权,如使用Spring ...

    深入探索高效的Java异常处理框架

    设计一个异常处理框架可以统一管理异常,提高代码的可维护性和可读性,同时能够提供详细的错误信息,帮助开发者快速定位问题。 通过对比Spring框架的异常处理,可以借鉴其优雅的异常转换和处理机制,如@...

    详解SpringCloud Finchley Gateway 统一异常处理

    SpringCloud Finchley Gateway 统一异常处理是指通过自定义实现 ErrorWebExceptionHandler 接口来处理系统级异常,以便统一处理错误信息。通过使用 DefaultErrorWebExceptionHandler 或 ...

    Java异步编程框架之Promise介绍

    Java异步编程框架Promise是用于处理异步操作的一个重要工具,尤其在Java中,Promise的概念被广泛应用于多种场景下进行高效的数据处理和结果获取。Promise框架主要作用在于简化异步编程模型,使其更加易于理解和使用...

    java数据库框架技术研究

    5. **异常处理**:框架需要处理SQL执行过程中可能出现的异常,提供统一的错误处理机制,以便开发者可以方便地捕获和处理问题。 6. **性能优化**:考虑到效率,框架可能会包含一些性能优化策略,比如预编译的SQL语句...

    java+SSH框架开发毕业设计

    【Java+SSH框架开发毕业设计】是一个典型的Java后端开发项目,主要采用了Spring、Struts2和Hibernate这三大主流开源框架。这些框架的组合在Web应用程序开发中被广泛应用,尤其在企业级应用中,能够有效地提高开发...

    关于调度数据网资源统一的自动化测试框架设计与实现.rar

    在IT行业中,调度数据网资源的统一管理与自动化测试框架的设计与实现是至关重要的环节,尤其是在大型企业或数据中心中。这种框架能够提高测试效率,确保网络资源的稳定性和安全性,并减少人为错误。以下是对该主题的...

    基于JAVA+EE平台的项目管理系统的设计与实现

    ### 基于JAVA+EE平台的项目管理系统的设计与实现 #### 概述 随着信息技术的快速发展,软件项目管理已成为企业提升竞争力的关键因素之一。基于JAVA+EE平台的项目管理系统旨在利用先进的技术手段来提高软件项目的管理...

    07 java异常处理和集合框架

    Java异常处理和集合框架是Java编程中的两个核心概念,它们对于编写健壮、高效和易于维护的代码至关重要。在这个主题中,我们将深入探讨这两个领域的关键知识点。 首先,让我们来看看Java异常处理。在Java中,异常是...

    java迷你框架附使用例程

    10. **异常处理**:框架可能会提供统一的异常处理机制,便于开发者对错误进行集中管理和报告。 11. **测试支持**:为了促进单元测试和集成测试,迷你框架可能包含了测试工具和辅助类,帮助开发者编写和运行测试。 ...

    Java 项目框架源码

    9. **异常处理**:SpringMVC提供了统一的异常处理机制,可以自定义异常处理器,将异常信息转化为用户友好的错误页面。 10. **单元测试与集成测试**:SpringMVC项目通常使用JUnit、Mockito等工具进行单元测试,对于...

Global site tag (gtag.js) - Google Analytics