异常的处理是每个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多层架构系统来说,尽可能避免(因抛出异常带来的)接口污染。
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script>
相关推荐
一个良好的异常处理机制能够提供详细的错误信息,帮助开发者快速定位问题,并且可以在生产环境中优雅地处理异常,防止用户看到不必要的技术细节。"J2EE项目中统一异常处理源码"的实践就是为了解决这些问题,通过...
#### 二、利用Struts2的全局异常处理机制 除了拦截器外,Struts2还提供了全局异常处理配置,可以在`struts.xml`文件中指定全局异常映射,实现对特定异常类型的统一处理。 ```xml <result name="error">/Web...
4. 提供统一的异常处理机制,如ExceptionHandler,来处理日志记录和错误反馈。 5. 在方法声明中只抛出基本的应用程序异常,以保持方法接口的稳定性。 通过这样的框架,J2EE应用程序的异常处理变得更加有序和高效,...
- **异常处理**:提供了BMP中异常处理的策略。 - **第六章:CMP的例子**: - **RosterApp应用概述**:概述了使用CMP(Container-Managed Persistence)实现的应用案例。 - **layerEJB代码分析**:详细分析了...
1. **Struts2**:Struts2是一个强大的MVC框架,通过拦截器机制处理HTTP请求,提供了一系列的拦截器来实现如认证、授权、异常处理等功能。它的Action类负责接收并处理请求,然后返回结果到视图。Struts2还支持多种...
- **知识点**:异常处理机制虽然强大,但在不当使用时会带来性能问题。抛出异常会涉及对象的创建和处理,这些都是相对昂贵的操作。 - **实践建议**:仅在必要时使用异常处理来处理错误情况。避免在控制流逻辑中过度...
3. **JSF(JavaServer Faces)**:JSF 是一个用于构建用户界面的MVC(Model-View-Controller)框架,它提供了一套UI组件和事件处理机制,简化了Web应用的开发。 4. **EJB(Enterprise JavaBeans)**:EJB 是Java...
#### 一、理解编码机制 在探讨解决方案之前,我们需要先了解一些基本概念,比如字符集和编码方式。 1. **字符集(Character Set)**:指的是一组定义了特定字符集合的规则。例如ASCII、GBK等。 2. **编码方式...
其次,笔试题部分通常会考察你的基础理论知识,比如J2EE架构、MVC设计模式、Java语法、多线程处理、异常处理、数据库连接池等。理解J2EE的分层架构(如表现层、业务逻辑层、数据访问层)是必备的基础,同时熟悉...
在J2EE 5.0的CHM文档中,开发者可以找到这些API的详细说明,包括类、接口、方法和异常等信息,这对于理解和使用这些技术至关重要。通过深入学习J2EE 5.0 API,开发者可以构建出高效、可扩展且易于维护的企业级应用。
7. **异常处理和日志记录**:为了保证系统的稳定性和可维护性,系统应该具备完善的异常处理机制,对可能出现的问题进行捕获和处理。同时,日志记录也很重要,它可以帮助开发者追踪系统运行情况,定位和解决问题。 8...
- **错误处理**:在前后端均添加适当的异常处理机制,以便捕获并处理可能出现的问题。 通过以上步骤,我们能够完成一个基本的Flex与J2EE整合的增删改查应用。这种结合方式不仅提供了丰富的用户体验,也充分利用了...
为了更接近J2EE的异常处理方式,可以创建自定义错误类,将错误信息包装为对象。 9. **安全性**: 虽然ASP不像J2EE那样提供全面的安全机制,但可以通过参数化查询防止SQL注入,使用SSL加密传输数据,以及限制对...
系统可能包含异常处理代码,并使用日志库(如Log4j)记录操作日志,便于调试和监控。 7. **部署和测试**:开发者需要了解如何将项目打包成WAR文件,然后在Web服务器(如Tomcat)上部署。同时,单元测试和集成测试也...
5. **错误处理与异常处理**:程序应能优雅地处理各种可能出现的错误情况,如无效的用户名或密码、数据库连接问题等。这通常通过try-catch-finally结构来实现,同时提供友好的错误提示信息。 6. **MVC模式**:这个...
Java语法简洁且强大,支持异常处理、多线程、网络编程等功能,为J2EE的复杂业务逻辑处理提供了坚实的语言基础。 **三、HTML语言** HTML(HyperText Markup Language)是网页开发的基础语言,用于定义网页的结构。在...
8. **忽视异常处理**:忽略异常或者仅仅打印堆栈信息,可能导致问题难以定位,应提供适当的异常处理机制。 9. **不使用设计模式**:设计模式是解决常见问题的最佳实践,不使用它们可能导致代码质量下降。 10. **...
6. **异常处理**:Struts2提供了一套强大的异常处理机制,可以捕获和处理应用程序中可能出现的错误,保证系统稳定运行。 在【压缩包子文件的文件名称列表】"Struts2_Example"中,我们可以推断这可能包含了一个使用...