J2EE系统异常的处理准则

异常的处理是每个Java程序员时常面对的问题,但是很多人没有原则,遇到异常也不知道如何去处理,于是遇到检查异常就胡乱 try...catch...一把,然后e.printStackTrace()一下了事,这种做法通常除了调试排错有点作用外,没任何价值。对于运行时异常,则干脆置之不理。

原因是很多开发者缺乏对异常的认识和分析,首先应该明白Java异常体系结构,一种分层继承的关系,你必须对层次结构熟烂于心:

Throwable(必须检查)
                     Error(非必须检查)
                     Exception(必须检查)
                                     RuntimeException(非必须检查)

一般把Exception异常及其直接子类(除了RuntimeException之外)的异常称之为检查异常。把RuntimeException以及其子类的异常称之为非检查异常,也叫运行时异常。

对于Throwable和Error,则用的很少,一般会用在一些基础框架中,这里不做讨论。

下面针对J2EE的分层架构:DAO层、业务层、控制层、展示层的异常处理做个分析,并给出一般处理准则。

一、DAO层异常处理

如果你用了Spring的DAO模板来实现,则DAO层没有检查异常抛出,代码非常的优雅。但是,如果你的DAO采用了原始的JDBC来写,这时候,你不能不对异常做处理了,因为难以避免的SQLException会如影随形的跟着你。对已这种DAO级别的异常,异常了你又能如何呢?与其这样胡乱try...catch...,囫囵吞枣消灭了异常不如让异常以另外一种非检查的方式向外传递。这样做好处有二:

1)、DAO的接口不被异常所污染,假设你抛出了SQLException,以后要是换了Spring DAO模板,那DAO接口就不再抛出了SQLException,这样,你的接口抛出异常就是对接口的污染。

2)、DAO异常向外传播给更高层处理,以便异常的错误原因不丢失,便于排查错误或进行捕获处理。

这里还有一个设计上常常令人困扰的问题:很多人会问,那定义一个什么样的异常抛出呢,或者是直接抛出一个throw RuntimeException(e)? 对于这个问题,需要分场合,如果系统小,你可以直接抛出一个throw RuntimeException(e),但对于一个庞大的多模块系统来说,不要抛这种原生的非检查异常,而要抛出自定义的非检查异常,这样不但利于排错,而且有利于系统异常的处理,通常针对每一个模块,粗粒度的定义一个运行时DAO异常。比如:throw new ModelXxxDAORuntimeException(".....",e),对于msg信息,你可写也可不写,根据需要灵活抛出。

这里常见一个很愚昧的处理方式,为每个DAO定义一个异常,呵呵,这样累不累啊,有多大意义,在Service层中调用时候,如果要捕获,还要捕获出一堆异常。这样致命的问题是代码混乱,维护困难,阅读也困难,DAO的异常应该是粗粒度的。

二、业务层异常处理

习惯上把业务层称之为Service层或者服务层,Service层的代表的是业务逻辑,不要迷信分太多太多层有多大好处,除非需要,否则别盲目划分不必要的层,层越多,效率越差,根据需要够用就行了。

Service接口中的每个方法代表一个特定的业务,而这个业务一定是一个完整的业务,通常会看到一些傻X的做法,数据库事务配置在 Service层,而Service的实现就是DAO的直接调用,然后在控制层(Action)中,调用了好多Service去完成一个业务,你气得已经无语了,低头找砖头去!!!

搞明白以上两个问题后再回过头看异常怎么处理,Service层通常依赖DAO,而Service层的通常也会因为调用别的非检查异常方法而必须面对异常处理的问题,这里和DAO层又有所不同,彼一时,此一时嘛!

一般来说一个小模块对应一个Service,当然也许有两个或多个,针对这个模块的Service定义一个非检查异常,以应付那些不可避免的异常检查,这个自定义异常可以简单的命名为XxxServiceRuntimeException,将捕获到的异常顺势转译为非检查异常后抛出。我喜欢这么做,因为前台是J2EE应用,前台是web页面,它们的Struts2等框架会自动捕获所有Service层的异常,并把异常交给开发者去自由处理。

但是还有一种情况,由于一些特殊的限制,如果某个异常一旦发生,必须做什么什么处理,而这种处理时硬性要求,或者调用某个Service方法,必须检查处理什么异常,也可以抛出非检查的自定义异常,往往出现这种情况的是政治原因。不推崇这种做法,但也不排斥。

总之,对于接口,尽可能不去用异常污染她!

时间: 2024-10-28 07:10:22

J2EE系统异常的处理准则的相关文章

初学者如何开发出高质量的J2EE系统

j2ee|初学 J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各种概念,本文章试图从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向. 首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系. J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase.到Delphi/VB等C/S结构,发展到B

初学者如何开发出一个高质量的J2EE系统

j2ee|初学   J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各种概念,本文章试图从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向. 首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系. J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase.到Delphi/VB等C/S结构,发展

如何开发出高质量J2EE系统

J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各种概念,本文章试图从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向 首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系. J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase.到Delphi/VB等C/S结构,发展到B/S(Browse

解决J2EE系统应用性能问题常用优化项目

性能问题的最明显表现是网页的响应时间变慢.在J2EE系统中,经常体现有下面更为基本的症状: 应用服务器资源的使用情况 JVM堆的使用情况 系统资源的使用情况 数据库资源的使用情况 网络活动 这些现象表明J2EE应用依赖很多外部资源,并且是运行在一个层次化的执行模式的环境中: 由于Java虚拟机和应用服务器掩盖了操作系统和硬件的特性,所以在设计软件系统时,架构工程师更应该深刻理解整个操作环境. 在设计软件系统时,架构工程师应把性能和可扩展性放在首位,然后开始寻找容易解决的问题,反应时间缓慢通常的原

常见的windows xp系统异常故障及解决途径

  板载声卡发音不正常?快速开机后鼠标无法移动?当你遇到这些系统故障时候是不是觉得很崩溃呢?今天小编就给大家盘点那些常见的windows xp系统异常故障及解决途径,希望对那些还在坚守windows xp系统的朋友们有点帮助. 一.板载声卡发音不正常 现在很多主板都附带了AC97的声卡,如果您的机器里的板载声卡是软声卡,那么有可能会在挂起到硬盘后,第二次快速开机的时候,发现声音不正常.笔者见过一块精英的SIS735主板上附带的软声卡就是如此--不仅在win xp快速开机后发音不正常,在windo

入侵检测-有关基于数据挖掘的系统异常检测的问题

问题描述 有关基于数据挖掘的系统异常检测的问题 各位大神你们好,本人弱X大四待毕业大学生一枚,毕业设计涉及到使用数据挖掘技术来 实现一个系统的异常检测,但是有很多问题不知道如何下手,所以在这请教诸位: 1.用于学习和挖掘的系统实时日志信息怎样提取出来 2.不知道有没有一种数据挖掘工具是可以编译运行自己的算法代码或者可以调用自己的算 法的呢 先在这谢过诸位~

初学小白该怎样开发出高效J2EE系统

当前,J2EE学习者可谓是越来越多,并且随着J2EE本身技术不断的发展,也涌现出各种新型概念,笔者特此撰写此文,目的就是试图从一种容易理解的角度对这些概念向初学者进行解释,从而让大家掌握学习J2EE学习方向,达到条理清晰. 首先,我们需要搞清楚的是,Java和J2EE是两种不同的概念:Java不仅仅是指一种语言,它已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前最主要的两大流派(体系)就是.NET和Java. J2EE可以说指Java在数据库信息系统上实现,

各种无线接入系统比较分析的准则

无线接入有蜂窝移动电话系统.数字无绳电话系统以及点到多点微波系统等多种技术体制可供选择.那么,为了实施我国电信普遍服务的艰巨任务,运营商选择那种技术体制为宜呢?要想合理高效地建设无线接入网,我们需要对不同的技术体制适用的运行环境客观地进行比较分析. 一般而言,任何无线电系统都可用于无线接入,但是其适用性是若干因素的函数.蜂窝宏区移动系统(如SCDMA400.CDMA450.GSM900)适用于乡村郊区.高车速和中业务量密度:蜂窝微区移动系统(如SCDMA1900.GSM1800)适用于市区.慢车

Cell插件在J2EE系统中的应用

摘要:在基于J2EE平台的信息系统中,具有丰富表现能力的Java Applet是界面层的一种重要形式.但Java API对打印的支持比较弱,打印输出复杂的单据和报表需要大量工作.本文介绍的系统通过引入一个ActiveX控件--Cell插件--来解决这个问题.该系统中,由Java Applet完成界面表现,由Cell插件完成打印输出,两者之间通过Sun公司的一套接口API互相通信. 一.Java Applet与Ocx控件的交互 1.1从Java Applet访问Java Script方法和Ocx控