还有另一篇文章也写得非常好 同样不知道作者是谁
1. checked 和 unchecked exceptions
致命错误, 不可恢复错误, 第三方包错误 包装为unchecked exception。
业务逻辑异常流,安全异常包装为checked exception. J2ee应用中有Business exception,
DB exception, security exception, confirmation exception
2. 抛出异常的策略
2.1 采用J2EE应用程序的 前端控制器(front controller) 集中控制处理,开发者实现具体的
业务逻辑的时候可以不关心异常的捕捉
2.2 方法签名中throws 一个基类的异常。这样前端控制器中只要捕捉这个基类的异常,开发者
可以定义自己派生的异常具体类
3. 在web层处理unchecked exceptions
所有的unchecked exceptions 都应该在web层进行处理, 可以在web.xml中配置异常发生时显
示定制的错误页面。
4. 封装第三方包的所有异常(Exception)为一个我们定义的unchecked exception
5. 对来自数据库操作的checked exception
比如Employee not found, Order not found可以抽
象一个RecordNotFoundException. 至于这个RecordNotFoundException是因为Employee还是Order
引起的作为context, 由context一起组成error code,抛给前端控制器。
6. 前端控制器中的错误处理
基类的异常处理(应用模板方法设计模式 Template Method)和子类(实现业务)的部分代码如
下,以struts为例
public abstract class BaseAppDispatchAction
extends DispatchAction{
...
protected static ThreadLocal
expDisplayDetails = new ThreadLocal();
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
...
try{
String actionMethod = request
.getParameter(mapping.getParameter());
finalDestination =dispatchMethod(mapping,
form, request, response,actionMethod);
}catch (BaseAppException Ex) {
ExceptionDisplayDTO expDTO =
(ExceptionDisplayDTO)expDisplayDetails
.get();
IExceptionHandler expHandler =
ExceptionHandlerFactory
.getInstance().create();
ExceptionDTO exDto = expHandler
.handleException(
expDTO.getContext(), userId, Ex);
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError(exDto
.getMessageCode()));
saveErrors(request, errors);
return mapping.findForward(expDTO
.getActionForwardName());
} catch(Throwable ex){
//log the throwable
//throw ex;
} finally {
expDisplayDetails.set(null);
}
业务子类中代码如下:
...
String exceptionActionForward =
"SearchAdjustmentPage";
String exceptionContext =
"divisionAction.searchDivision";
ExceptionDisplayDTO expDTO =
new ExceptionDisplayDTO(expActionForward,
exceptionContext);
expDisplayDetails.set(expDTO);
...
DivisionDTO divisionDTO =divisionBusinessDelegate
.getDivisionByNum(fromDivisionNum);
...
ExceptionDisplayDTO 作为data transfer object放在ThreadLocal中专门为了父类的异常处理
用
7. Exception Handler
上面的集中异常控制是在Excepiton Handler中处理的,包括:
根据异常类型获取异常代码,异常代码会用来显示异常信息. 异常类型与异常代码的对应关系
可以放到一个XML文件中. 根据异常代码取异常信息可以由ResouceBundle来实现,这样同时解决了
异常信息国际化的问题. 两个异常配置的xml文件如下:
<exception name="EmployeeConfirmationException">
<messagecode>messagecode.employeeconfirmation</messagecode>
<confirmationind>true</confirmationind>
<loggingtype>nologging</loggingtype>
</exception>
<exception name="RecordNotFoundException">
<messagecode>messagecode.recordnotfound</messagecode>
<confirmationind>false</confirmationind>
<contextind>true</contextind>
<loggingtype>error</loggingtype>
</exception>
第二个异常文件考虑了我们上面讲的context问题. 如果抛出的异常是
RecordNotFoundException, 并且当前的context是order.getOrder , 那么error code就
是:messagecode.recordnotfound.order.getOrder
为了避免多次解析这个XML文件,可以实现一个ExceptionInfoCache ,启动应用时缓冲这个xml的内
容.
ExceptionHandler中handleException方法代码片断如下:
public ExceptionDTO handleException(String userId,
BaseAppException exp) {
ExceptionDTO exDTO = new ExceptionDTO();
ExceptionInfoCache ecache =
ExceptionInfoCache.getInstance();
ExceptionInfo exInfo = ecache
.getExceptionInfo(
ExceptionHelper.getClassName(exp));
String loggingType = null;
if (exInfo != null) {
loggingType = exInfo.getLoggingType();
exDTO.setConfirmation(exInfo
.isConfirmation());
exDTO.setMessageCode(exInfo
.getMessageCode());
}
FileLogger logger = new FileLoggerFactory()
.create();
logger.logException(exp, loggingType);
相关推荐
一个良好的异常处理机制能够提供详细的错误信息,帮助开发者快速定位问题,并且可以在生产环境中优雅地处理异常,防止用户看到不必要的技术细节。"J2EE项目中统一异常处理源码"的实践就是为了解决这些问题,通过...
通常,开发者会在业务逻辑层(如Action层、Service层、DAO层)捕获并处理异常,但在拦截器中进行统一处理则更为高效和规范。以下是一个具体的示例: ```java public class ExceptionInterceptor extends ...
1. **Java基础知识**:首先,理解J2EE项目需要扎实的Java语言基础,包括面向对象编程、异常处理、集合框架等。 2. **Servlet**:Servlet是Java中用于处理HTTP请求的核心组件,它们在服务器端运行,接收并响应来自...
通过这个简单的J2EE项目,你可以学习到基本的J2EE概念和实践,为进一步深入学习如Spring框架、微服务架构、RESTful API设计等更高级主题打下基础。同时,项目的代码和结构也可以作为模板,为创建自己的项目提供指导...
总的来说,"J2EE项目实例源码"提供了一个实践性的学习案例,涵盖了J2EE应用开发中的数据库设计、连接、业务逻辑处理以及视图展现等多个关键环节。通过研究这个项目,开发者可以深化对J2EE平台的理解,提升实际项目...
经典J2EE项目案例 从给定的文件信息中,我们可以提取出以下知识点: 1. 项目开发环境和工具 * 项目开发环境:Tomcat6.0、IE10、Firefox8.0、JDK1.7、Windows 7 * 项目开发工具:MyEclipse9.0、Mysql、JUnit 2. ...
这个压缩包“j2ee项目中所用到的包”包含了在J2EE项目中常用的框架和库,使得开发者能够快速搭建开发环境,减少寻找和配置组件的时间,提高开发效率。 首先,我们来看看其中的一个关键组件——Hibernate。Hibernate...
在《J2EE案例开发》这个压缩包中,你可能会找到一个完整的J2EE项目实例,包括源代码、配置文件、数据库脚本等,通过学习和分析这个案例,你可以更好地理解上述知识点如何在实际项目中应用。记得动手实践,理论结合...
在J2EE项目中,Servlet常用于接收客户端请求,处理业务逻辑,并将结果返回给用户。 2. **JSP(JavaServer Pages)**:JSP是一种动态网页技术,允许开发者在HTML页面中嵌入Java代码。它简化了视图层的开发,使页面...
在J2EE项目开发中,理解并掌握J2EE架构及其相关技术是非常关键的。J2EE应用程序通常由四层结构组成,分别是客户层、应用层、表示逻辑层和企业信息系统层。客户层主要负责与用户的交互,应用层处理业务逻辑,表示逻辑...
本文将探讨如何在J2EE环境中有效地管理和处理异常。 首先,我们要区分两种类型的异常:checked异常和unchecked异常。Checked异常是那些在编译时就需要被捕获或声明的异常,比如IOException和SQLException。它们通常...
本书汇集了大量企业级应用项目开发的经验,归纳了不同项目中使用的框架、模式、设计方法、开发方法,形成一个完整的技术体系和指导方法,以供用J2EE进行项目开发的初级人员和有一定经验的高级开发人员阅读。...
这份文档可能包含了模板的具体结构、使用方法、优势以及实际项目中的应用示例,对于深入理解和应用J2EE项目开发模板非常有帮助。 总的来说,J2EE项目开发模板是企业级Java开发的基石,它规范了开发流程,提升了开发...
除了这些工具,还有一些通用的测试工具在J2EE项目中也很常见,例如SonarQube用于静态代码分析和质量控制,Jenkins用于持续集成和持续部署,确保每次代码更改后都能快速发现问题。 在实际测试过程中,还需要遵循敏捷...
《教你开发J2EE项目》是一篇旨在引导开发者逐步学习和掌握J2EE项目开发的教程,由彭晨阳(J道)撰写。本教程详细介绍了如何构建一个基于Spring、Struts和Hibernate架构的J2EE应用。以下是教程中涵盖的关键知识点: ...
这篇指南不是为J2EE服务器及工具供应商准备的,它没有解释如何实现J2EE结构,也没有解释J2EE软件包。J2EE规范描述了J2EE结构并可以从下面的网址下载: http://java.sun.com/j2ee/docs.html#specs
在这个“J2EE专业项目实例”中,我们可能会看到以下几个关键知识点的实现: 1. **Servlet与JSP**:Servlet是Java编写的服务端程序,用于处理HTTP请求,而JSP则是一种视图技术,可以将HTML、Java代码和脚本语言混合...
通过深入研究提供的J2EE项目案例源代码,初学者不仅可以学习到如何在实际项目中应用这些技术,还能了解如何组织代码结构,遵循设计模式,以及如何有效地利用J2EE提供的服务。这将有助于他们快速提升在企业级Java开发...
j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发...