在实际的J2EE项目中,系统内部难免会出现一些异常,就如Struts+Spring+Hibernate项目:通常一个页面请求到达后台以后,首先是到action(就是MVC中的controller),在action层会调用业务逻辑层service,而在service层会调用持久层dao进而获得数据,再将获得的数据一层一层返回到action层,然后通过action控制层转发到指定页面,而这期间都可能会发生异常,dao层可能会发生SQLException异常,service层可能会发生NullPointException异常,action层可能会发生IOException异常,如果这三层都不处理的话异常信息会抛到服务器,然后服务器会把异常信息打印到浏览器上(用户看不懂信息,体验十分不好,),处理得好可以使开发效率快速提升。
通常处理这些异常有两种方法:①直接throws,②try...catch...在catch块中不做任何处理,或者仅仅printStackTrace()把异常信息打印出来。第一种就是会在浏览器上打印出用户看不懂的异常信息,第二种方法则是页面不报错也不执行用户的请求。
如何更好的解决这些异常?
首先,在action类、service类、dao类,如果有必要就try...catch...,catch块内不记录log,通常是抛出一个新异常
//action层执行数据添加操作
public String save(){
try{
//调用service的save方法
service.save(obj);
}catch(Exception e){
//抛出Runtime异常可使得不必再方法后写throws xx
throw new RuntimeException("添加数据时发生错误!",e);
}
return "success";
}
然后在异常拦截器对异常进行处理
public String intercept(ActionInvocation actioninvocation) {
String result = null; // Action的返回值
try {
// 运行被拦截的Action,期间如果发生异常会被catch住
result = actioninvocation.invoke();
return result;
} catch (Exception e) {
/**
* 处理异常
*/
String errorMsg = "未知错误!";
//通过instanceof判断到底是什么异常类型
if (e instanceof BaseException) {
BaseException be = (BaseException) e;
be.printStackTrace(); //开发时打印异常信息,方便调试
if(be.getMessage()!=null||Constants.BLANK.equals(be.getMessage().trim())){
//获得错误信息
errorMsg = be.getMessage().trim();
}
} else if(e instanceof RuntimeException){
//未知的运行时异常
RuntimeException re = (RuntimeException)e;
re.printStackTrace();
} else{
//未知的严重异常
e.printStackTrace();
}
//把自定义错误信息
HttpServletRequest request = (HttpServletRequest) actioninvocation
.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
/**
* 发送错误消息到页面
*/
request.setAttribute("errorMsg", errorMsg);
/**
* log4j记录日志
*/
Log log = LogFactory
.getLog(actioninvocation.getAction().getClass());
if (e.getCause() != null){
log.error(errorMsg, e);
}else{
log.error(errorMsg, e);
}
return "error";
}// ...end of catch
}
需要注意的是,在使用instanceOf判断异常类型的时候一定要从子到父依次找,比如BaseException继承RunTimeException,则必须首先判断是否是BaseException再判断是RunTimeException,最后在error
jsp页面显示出具体的错误信息
<body>
<s:if test="%{#request.errorMsg==null}">
<p>对不起,系统发生了未知的错误</p>
</s:if>
<s:else>
<p>${requestScope.errorMsg}</p>
</s:else>
</body>
以上方式可以拦截后台代码所有的异常,但如果出现数据库链接时异常不能被捕捉的则可使用struts2的全局异常处理机制处理
<global-results>
<result name="error" >/Web/common/page/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
文章转自:http://my.oschina.net/u/817908/blog/158056
其他关于J2EE项目异常处理机制请看:http://www.iteye.com/topic/1073599
分享到:
相关推荐
当我们谈论Java Web项目的整体异常处理机制时,我们关注的是如何优雅地处理可能出现的各种异常,避免将错误信息直接暴露给用户,同时确保系统能够进行必要的错误记录和反馈。 在Spring+Struts2+Hibernate这样的经典...
总结起来,Java Web项目的整体异常处理机制应包括以下几个关键点: 1. 在Action、Service和DAO层使用try-catch块,捕获异常并抛出自定义异常。 2. 使用日志工具记录异常信息,便于排查问题。 3. 设计并实现异常拦截...
7. **异常处理和错误页面**:当服务器遇到问题时,例如找不到资源或处理请求出错,应提供合适的错误信息给客户端。这需要合理的异常处理机制,并可能涉及自定义错误页面的设置。 8. **安全性考虑**:虽然这是一个...
此外,孙卫琴还会介绍Struts的国际化支持、异常处理机制、Tiles框架用于页面布局,以及Struts与其他技术如Hibernate(ORM框架)或Spring(企业级应用框架)的整合。这些都是在实际开发中非常实用的知识点。 在...
5. 错误处理和异常处理:如何优雅地处理程序运行时可能出现的问题。 6. 安全性:如防止SQL注入,用户认证和授权等。 7. 性能优化:如缓存策略,减少数据库查询等。 总的来说,这个Java Web网络商城购物系统展示了在...
- **其他**:可能包括异常处理、安全考虑、性能优化等方面的规定。 总的来说,Java Web开发规范是开发团队共同遵守的行为准则,它涵盖了项目的各个阶段,从初始化到上线,再到维护,都有明确的指导。遵守这些规范...
Struts2的优势包括其基于拦截器的可扩展性,便捷的表单参数处理,丰富的页面标签,异常处理机制,以及页面国际化和数据验证功能。 Hibernate作为SSH中的数据访问层框架,是用于对象关系映射(ORM)的开源库。它封装...
第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...
同时,理解异常处理、IO流、集合框架(如List、Set、Map)以及多线程等也是必备技能。 2. **Servlet**:Servlet是Java Web应用中的服务器端组件,用于处理HTTP请求。你需要了解Servlet生命周期,如何创建和配置...
9. **异常处理**:在开发过程中,错误和异常处理是必不可少的。教程可能会介绍如何在Java Web应用中捕获和处理异常,以及使用全局异常处理器。 10. **过滤器和监听器**:CHAP06可能涉及到过滤器(Filter)和监听器...
可能涉及了Java语法、面向对象编程、异常处理、集合框架、IO流、多线程,以及如Servlet、JSP、Spring Boot等Web开发框架的使用。 2. **study_写嵌入式操作系统.nyf**:虽然标题没有直接提到Java Web,但此文件可能...
以上技术的结合使用,能够构建出高性能的Web应用,其中JSP和Servlet负责展示和处理请求,Struts 2提供业务流程控制,Hibernate处理数据库操作,Spring提供整体框架支持和依赖注入,而AJAX则优化了用户体验。...
1. **Java基础知识**:在进入Java Web开发之前,了解Java语言的基本语法、面向对象编程、异常处理和集合框架是必要的。Java Web开发基于Java语言,因此扎实的Java基础对于理解Web应用的逻辑至关重要。 2. **Servlet...
应当适当处理可能出现的异常情况,确保应用程序的健壮性。 #### 八、总结 WebDynpro for Java提供了强大的工具和技术来支持动态创建、构建和映射上下文的需求。通过熟练掌握这些技术,开发者可以构建出更加灵活、...
9. **错误与异常处理**:良好的错误处理机制能提高用户体验,项目中会有处理常见错误和异常的方法。 10. **测试与调试**:初学者还会学习如何编写单元测试,以及如何使用工具如Eclipse或IntelliJ IDEA进行项目调试...
【乐游网】Java Web开发概要设计文档旨在提供项目整体架构、主要功能模块和系统设计的概述,以便团队成员和利益相关者了解系统的基本结构和实现方式。以下是该概要设计的关键点: 1. **编写目的** - 本概要设计的...
在使用异步处理时,需要注意线程安全、异常处理、超时控制以及结果的正确回调。合理的线程池配置可以避免资源浪费,同时保证系统的稳定性和响应速度。此外,监控异步任务的执行情况也非常重要,以便于诊断和优化...
6. **异常处理**:在编写源码时,良好的异常处理机制能够保证程序的健壮性。对于可能出现的错误,如网络问题、数据库异常或数据验证失败,都需要适当地捕获并处理。 7. **Session与Cookie**:为了保持用户状态,...
8. **异常处理与日志记录** - 使用try-catch-finally结构处理可能出现的异常,保证程序健壮性。 - 日志记录系统行为,便于问题排查和性能分析。 9. **测试** - 单元测试验证各模块功能,集成测试确保各组件协同...
2. **异常处理**:正确处理可能出现的运行时错误,提供友好的用户反馈。 3. **性能优化**:如合理设计数据库索引,避免冗余数据,提高查询效率。 4. **测试**:编写单元测试和集成测试,确保功能的正确性和稳定性...