Aaronlong31

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  12 Posts :: 3 Stories :: 17 Comments :: 0 Trackbacks

#

 

 

2EE系统异常的处理准则

异常的处理是每个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方法,必须检查处理什么异常,也可以抛出非检查的自定义异常,往往出现这种情况的是政治原因。不推崇这种做法,但也不排斥。

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

三、控制层异常

控制层说的简单些就是常见的Action层,主要是控制页面请求的处理。控制层通常都依赖于Service层,现在比较流行的框架对控制层做得 都相当的到位,比如Struts2、SpringMVC等等,他们的控制层框架会捕获业务层的所有异常,并在控制层中声明可能抛出Exception,因此控制层一般不处理什么异常。

如果是控制层中因为调用了一些非检查异常的方法,比如IO操作等,可以简单处理下异常,保证流的安全,这才是目的。

四、显示层异常处理

对于页面异常,处理的方式多种多样,一是不处理异常,一旦异常了,页面就报错。二是定义出错页面,根据异常的类型以及所在的模块,导航到出错页面。

一般来说,出错页面是更友好的做法。

另外还有特殊的处理方式,展示页面的模板可以捕获异常,并根据情况将异常信息铺到相应的位置,这样就更友好了,不过复杂度较高。

怎么处理,就看需要了。

五、总结

1)、对于异常处理,应该从设计、需要、维护等多个角度综合考虑,有一个通用准则:千万别捕获了异常什么事情都不干,这样一旦出现异常了,你没法依据异常信息来排错。

2)、对于J2EE多层架构系统来说,尽可能避免(因抛出异常带来的)接口污染。

以上论述仅代表个人观点,欢迎交流。

本文出自 “熔岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/244138

 

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/244138

posted @ 2010-01-25 11:09 Aaronlong31 阅读(259) | 评论 (0)编辑 收藏

http://www.verycd.com/topics/2793761/comments/page33/#comment7232788

美国版

上课铃响了,孩子们跑进教室,这节课老师要讲的是《灰姑娘》的故事。
老师先请一个孩子上台给同学讲一讲这个故事。孩子很快讲完了,老师对他表示了感谢,然后开始向全班提问。

老师:你们喜欢故事里面的哪一个?不喜欢哪一个?为什么?
学生:喜欢辛黛瑞拉(灰姑娘),还有王子,不喜欢她的后妈和后妈带来的姐姐。辛黛瑞拉善良、可爱、漂亮。后妈和姐姐对辛黛瑞拉不好。
老师:如果在午夜 12点的时候,辛黛瑞拉没有来得及跳上她的番瓜马车,你们想一想,可能会出现什么情况?
学生:辛黛瑞拉会变成原来脏脏的样子,穿著破旧的衣服。哎呀,那就惨啦。
老师:所以,你们一定要做一个守时的人,不然就可能给自己带来麻烦。另外,你们看,你们每个人平时都打扮得漂漂亮亮的,千万不要突然邋里邋遢地出现在别人面前,不然你们的朋友要吓着了。女

孩子们,你们更要注意,将来你们长大和男孩子约会,要是你不注意,被你的男朋友看到你很难看的样子,他们可能就吓昏了(老师做昏倒状)

老师:好,下一个问题,如果你是辛黛瑞拉的后妈,你会不会阻止辛黛瑞拉去参加王子的舞会?你们一定要诚实哟!
学生:(过了一会儿,有孩子举手回答)是的,如果我辛黛瑞拉的后妈,我也会阻止她去参加王子的舞会。
老师:为什么?
学生:因为,因为我爱自己的女儿,我希望自己的女儿当上王后。
老师:是的,所以,我们看到的后妈好象都是不好的人,她们只是对别人不够好,可是她们对自己的孩子却很好,你们明白了吗?她们不是坏人,只是她们还不能够像爱自己的孩子一样去爱其它的孩。
-
-老师:孩子们,下一个问题,辛黛瑞拉的后妈不让她去参加王子的舞会,甚至把门锁起来,她为什么能够去,而且成为舞会上最美丽的姑娘呢?
学生:因为有仙女帮助她,给她漂亮的衣服,还把番瓜变成马车,把狗和老鼠变成仆人。
老师:对,你们说得很好!想一想,如果辛黛瑞拉没有得到仙女的帮助,她是不可能去参加舞会的,是不是?
学生:是的!
老师:如果狗、老鼠都不愿意帮助她,她可能在最后的时刻成功地跑回家吗?
学生:不会,那样她就可以成功地吓到王子了。(全班再次大笑)
老师:虽然辛黛瑞拉有仙女帮助她,但是,光有仙女的帮助还不够。所以,孩子们,无论走到哪里,我们都是需要朋友的。我们的朋友不一定是仙女,但是,我们需要他们,我也希望你们有很多很多的

朋友。下面,请你们想一想,如果辛黛瑞拉因为后妈不愿意她参加舞会就放弃了机会,她可能成为王子的新娘吗?
学生:不会!那样的话,她就不会到舞会上,不会被王子遇到,认识和爱上她了。
老师:对极了!如果辛黛瑞拉不想参加舞会,就是她的后妈没有阻止,甚至支持她去,也是没有用的,是谁决定她要去参加王子的舞会?
学生:她自己。
老师:所以,孩子们,就是辛黛瑞拉没有妈妈爱她,她的后妈不爱她,这也不能够让她不爱自己。就是因为她爱自己,她才可能去寻找自己希望得到的东西。如果你们当中 有人觉得没有人爱,或者像辛

黛瑞拉一样有一个不爱她的后妈,你们要怎么样?
学生:要爱自己!
老师:对,没有一个人可以阻止你爱自己,如果你觉得别人不够爱你,你要加倍地爱自己;如果别人没有给你机会,你应该加倍地给自己机会;如果你们真的爱自己,就会为自己找到自己需要的东西,

没有人可以阻止辛黛瑞拉参加王子的舞会,没有人可以阻止辛黛瑞拉当上王后,除了她自己。对不对?
学生:是的!!!

-老师:最后一个问题,这个故事有什么不合理的地方?
学生:(过了好一会)午夜 12点以后所有的东西都要变回原样,可是,辛黛瑞拉的水晶鞋没有变回去。
老师:天哪,你们太棒了!你们看,就是伟大的作家也有出错的时候,所以,出错不是什么可怕的事情。我担保,如果你们当中谁将来要当作家,一定比这个作家更棒!你们相信吗? 孩子们欢呼雀跃。
此为美国一所普通小学的一堂阅读课。我们是几岁的时候才想到这些层面?
——小学老师教的,终身受用——

 

中国版

上课铃响,学生,老师进教室。
老师:今天上课,我们讲灰姑娘的故事。大家都预习了吗?
学生:这还要预习?老得掉渣了。
老师:灰姑娘?是****童话还是安徒生童话?他的作者是谁?哪年出生?作者生平事迹如何?
学生:......书上不都写了吗?不会自己看啊?
老师:这故事的重大意义是什么?
学生:得,这肯定要考的了。
老师:好,开始讲课文。谁先给分个段,并说明一下这么分段的理由。
学生:前后各一段,中间一段,总分总.......
老师:开始讲课了,大家认真听讲。
学生:已经开始好久了 .... ...........
老师:说到这里,大家注意这句话。这句话是个比喻句,是明喻还是暗喻?作者为什么这么写?
学生: (n人开始睡觉 .... ........... )
老师:大家注意这个词,我如果换成另外一个词,为什么不如作者的好?
学生:(又 n人开始睡觉 .... ........... )
老师:大家有没有注意到,这段话如果和那段话位置换一换,行不行?为什么?
学生:我又不是你,我怎么会注意到啊? (又 n人开始睡觉.... )
老师:怎么这么多人睡觉啊?你们要知道,不好好上课就不能考好成绩,不能考好成绩就不能上大学,不能上大学就不能......你们要明白这些做人的道理。
PS:考上大学,就开始人渣般的生活。

posted @ 2010-01-20 13:14 Aaronlong31 阅读(361) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2