不管是什么程序开发都可能会出现各种各样的异常。可能是程序错误,也可能是业务逻辑错误。针对这个各个开发人员都有自己的处理方式,不同的风格增加了业务系统的复杂度和维护难度。所以定义好一个统一的异常处理框架还是需要的。我们开发框架采用java实现,java中的异常一般分为两种,检查异常和运行时异常。检查异常(checked exception)有可能是程序的业务异常,这种异常一般都是开发人员自定义的、知道什么时候会抛出什么异常并进行捕捉处理。也可以是系统的异常,不捕捉编译不会通过,如 IOException、SQLException、ClassNotFoundException , 这种是必须要捕捉的并且大多都是继承Exception。 运行时异常一般都是系统抛出来的异常,这种异常不捕捉处理也不会报编译错误,如NullPointerException,ClassCastException。运行异常都是继承至RuntimeException。不管是检查异常还是运行时异常都是继承至Exception。另外还有一种异常是系统错误Error,这种异常是系统出现了故障抛出来的不能捕捉,如OutOfMemoryError。Exception和Error都是继承至Throwable。
了解了java的异常体系后,我们设计一下web框架的异常处理格式。在以往EJB时代的J2ee系统,一般是标准的三层架构:web层、业务逻辑层、数据访问层,并且每一层都分别部署在不同的机器集群中。这样我们的异常一般分为三个,WebException、BizException、DAOException分别映射到web层、业务逻辑层、数据访问层。并且这些异常都要设计的串行化可以跨机器传递生成异常链。这样的好处是看到异常链知道从哪儿抛出来的错误,比较清晰明了。
随着后面spring的推出,java的开发越来越轻量级很多时候一台服务器可以同时部署三层并集群化,架构模式也慢慢由充血模式演变为贫血模式,再也没有了厚重的实体Bean和有状态会话Bean。针对现在轻量级的框架,异常结构如何设计呢?
先看看我们这个异常结构需要解决的问题是什么?
- 规范大家的异常处理方式。
- 简化异常处理。
- 区分业务异常和系统异常,业务异常需要业务逻辑支持,系统异常需要记录log。
- 友好的异常展示。
- 异常结构可扩展。
针对这些点,我的想法是开发可以使用三个类:SDKException、BizException、BizSystemException。SDKException是处理的基础类,可以在里面封装一些异常处理的基本函数。BizException是业务逻辑处理异常,一般这类异常是不需要记录log,只是展示给页面显示并提示给用户。如你的用户名、密码为空等错误。BizSystemException是业务系统异常,这类异常一般需要捕捉并记录log,比如数据库的主键冲突、sql语句错误等。按照三层架构的话,我们不可能对每一层都捕捉并且记录log,会造成重复log。可以从DAO层把捕捉到的数据库异常转换为BizSystemException抛出,如果有BizException也抛出。业务逻辑层对于BizSystemException、BizException不处理直接抛出。所有处理都在web层进行集中处理,如果是BizException,根据错误码和错误消息显示给用户对应的页面和错误消息。如果是BizSystemException告知用户系统错误,并把错误结果记入log。如果是其他异常和BizSystemException一致。这样就减少了异常处理的复杂度,开发也不用关心什么检查异常,运行时异常。
如果是ajax请求在做web层时,把返回的jsp变成json格式或者流格式输出即可,不影响异常框架。如采用struts2结构的代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public String testAjax()
{ try { genAjaxDataStr(0, "{}"); } catch (BizException e) { getRequest().setAttribute(this.ERRORMESSAGE, e.getErrorMessage()); return this.ERRORJSON; } catch (BizSystemException e) { getRequest().setAttribute(this.ERRORMESSAGE, this.SYSTEMERROR); return this.ERRORJSON; } catch (Exception e) { this.errorTrace("test", e.getMessage(), e); getRequest().setAttribute(this.ERRORMESSAGE, this.SYSTEMERROR); return this.ERRORJSON; } return this.NONE; } |
这样前台就能根据我们的异常显示对应的错误页面了,并能把系统知道的和未知的异常记入log。
针对struts2还有个问题,在开发模式时,struts2和webwork的异常打印在页面,我们可以根据页面输出进行调试。一但部署在生产环境,需要将这个模式关闭,log就没有了。
1
|
<constant name="struts.devMode" value="false" />
|
为了记录一些未知的错误,需要做以下步骤:
- 将全局的异常映射页面从struts2的包定义里去掉。如果不去掉,在webwork不会抛出异常也就找不到出了什么问题。
- 扩展struts的DispatcherFilter捕捉未知的异常并记录入log。
1
2 3 4 |
<global-exception-mappings>
<exception-mapping exception="com.linktong.sdk.biz.exception.BizException" result="checkedException" /> </global-exception-mappings> |
这样,基本的异常框架就搭建完成。更进一步需要做的是:
- 分布式全局错误码体系,保证所有机器都共用一套错误码。
- 分布式部署,异常传递。可以采用hessian序列化错误码的机制,不用传输整个异常链节省带宽。
- 集中logger服务处理,所有机器的log统一发送到集中服务器处理。logger框架和log4j也有服务器的机制。
针对web框架、分布式部署、log服务器再讨论:)
原创文章,转载请注明: 转载自Lanceyan
本文链接地址: WEB框架的错误体系
相关推荐
4. **Web框架**: - Spring框架:讲解Spring的依赖注入、AOP、MVC、数据访问和事务管理。 - Struts 2或Struts 1:理解MVC设计模式在Struts中的实现。 - Hibernate:ORM框架,用于简化数据库操作。 - MyBatis:...
Web服务描述语言(WSDL)定义了服务的接口,包括输入、输出、错误处理等,使得服务消费者能够理解如何调用服务。 3.3 UDDI 统一描述、发现和集成(Universal Description, Discovery and Integration)是Web服务的...
**Swift-Blackfish:受Node.js和Express启发的Web框架** Swift-Blackfish是一个由Swift编程语言构建的高性能Web框架,灵感来源于Node.js中的Express框架。这个框架的设计目标是为开发者提供一个熟悉、灵活且高效的...
总的来说,Web服务平台体系架构是一个复杂的框架,它涵盖了服务的创建、发布、调用和管理的全过程。调用子系统、序列化子系统和部署子系统的协同工作,使得开发者能够在不同的编程语言和平台上开发、集成和使用Web...
可能是程序错误,也可能是业务逻辑错误。针对这个各个开发人员都有自己的处理方式,不同的风格增加了业务系统的复杂度和维护难度。所以定义好一个统一的异常处理框架还是需要的。我们开发框架采用java实现,java中的...
《精通Eclipse Web开发:Java体系结构、工具、框架及整合应用 源代码(ch3-ch18)》是一部深入探讨Eclipse平台下Web应用程序开发的资源集合,涵盖了从基础到高级的诸多技术要点。本资源包含从第三章至第十八章的源代码...
**Midway:面向未来的IoC Web框架** Midway是一款创新的Web开发框架,它采用了面向未来的设计理念,结合了依赖注入(IoC)设计模式,为全栈开发提供了高效、可扩展的解决方案。该框架充分利用了TypeScript的强大...
2. **VCL组件兼容**:该框架保留了Delphi的VCL组件体系,开发者可以直接将VCL组件用于Web应用,如按钮、表格、图表等,极大地降低了学习成本和开发难度。 3. **高性能渲染引擎**:TMS WEB Core采用了高效的HTML5和...
Node.js企业级Web开发框架是近年来随着Node.js的普及而逐渐兴起的一种技术实践。Node.js以其高效的异步I/O和事件驱动模型,在Web开发领域展现出强大的潜力,但将其应用于大型企业级项目,需要克服一系列挑战。本文将...
《电子商务》教学课件的第二章重点探讨了电子商务框架体系,包括信息流、资金流、物流,以及在现代电子商务环境中的重要概念Web2.0。此外,还提到了5F+2S+1P框架,这是一个更为全面的电子商务模型,涵盖了商务活动的...
**WCF(Windows Communication Foundation)建立的框架体系详解** Windows Communication Foundation(WCF)是微软.NET Framework中的一个核心组件,用于构建高度可配置、安全、可靠的服务架构。它提供了全面的编程...
"Granite"是Rails生态系统中的一个应用程序体系结构框架,旨在进一步提升Rails项目的组织结构和可维护性。它提供了一种结构化的模式来组织代码,使得大型Rails应用的管理变得更加容易。Granite强调清晰的职责划分和...
Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,它简化了构建企业级Java Web应用的过程。Struts2的核心组件包括Action类、配置文件、拦截器等。Action类是处理用户请求的中心,而配置...
在IT行业中,Web自动化测试是确保网页应用质量的关键步骤,而POM(Page Object Model)模式是Selenium自动化测试框架中一种推荐的编程实践。它旨在提高代码的可维护性和可重用性,使得测试脚本更加清晰和易于管理。...
电子商务框架体系是理解现代商业活动的关键,它涵盖了信息流、资金流和物流三大核心组成部分,以及在电子商务环境中逐渐被重视的信用流和人员流。这一框架不仅定义了电子商务的运作方式,也揭示了如何在数字时代高效...
5. **插件支持**: Struts2具有丰富的插件体系,如Tiles插件用于布局管理,Struts2-dojo-plugin提供与Dojo库的集成,JSON插件支持JSON数据格式的处理,增强了框架的灵活性和扩展性。 6. **模型驱动**: Struts2支持...
### Web三层架构体系详解 #### 一、三层架构概述 三层架构是一种常见的软件设计模式,尤其在Web开发领域被广泛采用。它通过将应用程序分解为三个独立的逻辑层,能够提高系统的灵活性、可维护性和可扩展性。三层...