不管是什么程序开发都可能会出现各种各样的异常。可能是程序错误,也可能是业务逻辑错误。针对这个各个开发人员都有自己的处理方式,不同的风格增加了业务系统的复杂度和维护难度。所以定义好一个统一的异常处理框架还是需要的。我们开发框架采用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框架的错误体系
相关推荐
可能是程序错误,也可能是业务逻辑错误。针对这个各个开发人员都有自己的处理方式,不同的风格增加了业务系统的复杂度和维护难度。所以定义好一个统一的异常处理框架还是需要的。我们开发框架采用java实现,java中的...
我们在开发企业WEB应用程序时都有一些类似的需求,例如:都需要登录页面、用户/角色管理、权限验证、数据有效性验证、多语言/本地化等等。一个高品质的大型软件都会运用一些最佳实践,例如分层体系结构、领域驱动...
《Web安全深度剖析》从攻到防,从原理到实战,由浅入深、循序渐进地介绍了Web 安全体系。全书分4 篇共16 章,除介绍Web 安全的基础知识外,还介绍了Web 应用程序中最常见的安全漏洞、开源程序的攻击流程与防御,并...
Java Web编程宝典-十年典藏版.pdf 是PDF电子书,不是源码。共分2个包。 《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。...
EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包,基础数据库设计一整套完整的基于B/S架构应用程序设计开发的完整解决方案。Efs框架从研发到时间,历时近10年,...
Opal是一个完整的堆栈Web框架,可简化医疗保健数字工具的构建。 它建立在已建立的开放源代码技术的基础上,其跟踪记录可帮助开发人员构建易于维护的强大应用程序。 最值得注意的是,它利用了 , 和 。 从那里,...
通过改变Web站点的体系结构和修改其表现技术,能够极大地提升搜索引擎的排名和流量水平。这本独特的手册专门为PHP开发人员或涉足技术的营销人员编写,为创建和维护针对搜索引擎进行优化的Web站点提供了各种技术,力...
EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包,基础数据库设计一整套完整的基于B/S架构应用程序设计开发的完整解决方案。Efs框架从研发到时间,历时近10年,...
但是,请注意,自从我撰写该文章以来,体系结构发生了很多变化。 goRE是为网络渗透测试和反向工程创建的。 当您通过使用go插件使用Chrome进行渗透测试时,它利用Chrome Dev Tool协议来拦截HTTP响应。 goRE插件 ...
EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包,基础数据库设计一整套完整的基于B/S架构应用程序设计开发的完整解决方案。Efs框架从研发到时间,历时近10年,...
EfsFrame是一套整体的企业级php开发框架解决方案,整个框架体系中包含了Web表现层开发包,组件开发包,基础数据库设计一整套完整的基于B/S架构应用程序设计开发的完整解决方案。Efs框架从研发到时间,历时近10年,...
优雅的Golang Web框架 Goyave是一个专注于REST API的渐进式可访问Web应用程序框架,旨在使后端开发变得轻松愉快。 它具有简洁和简洁的理念,可以使程序更优雅,更易于维护和更具针对性。 Goyave是一个自以为是的框架...
1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...
Angular被认为是最流行和功能最强大的前端框架之一,已经进行了重大改革,以接受新兴的Web技术,以便开发人员可以构建尖端的Web应用程序。 本书为您提供了使用Angular和Laravel Restful后端从零开始构建现代全栈Web...
闪电战基本概述一个Node.js快速,声明性的框架,用于编写Web服务器,没有taradiddles。哲学: Bliz是用和编写的。 我相信这些都是非常强大的概念,它们会导致更稳定的代码库,进而有助于构建稳定的应用程序。 Bliz的...
采用软件堆层,零依赖第三方及纯注解配置理念,实现了请求响应模型,应用授权及验证,服务安全控制 ,拦截器体系,SDK等诸多领域问题,同时提供整合Spring等主流服务层框架,可方便快捷地开发WebService服务。...
1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...
瓶底使用Flask微框架和MVC软件体系结构模式的Web应用程序的基本结构。特征基本模板,本地存储有JQuery,Popper,Bootstrap和Fontawesome。 带有导航栏的主模板,以及一些菜单示例。 错误的模板(错误403、404和500)...
15.4 Web服务体系结构 202 15.5 Web服务协议栈 202 15.6 使用.net2005创建Web服务 203 15.7 创建自定义的Web服务 205 15.8 使用自定义的Web服务 207 第十六章:WEBPARTS 209 16.1 Web部件基本知识 209 16.2 门户组件...