只有在可以合理地预期调用者可以处理异常时,DAO 接口中的方法才应该抛出检查过的异常。如果调用者不能以有意义的方式处理这个异常,那么考虑抛出一个未检查的(运行时)异常。
如果数据访问代码捕获了一个异常,不要忽略它。忽略捕获的异常的 DAO 是很难进行故障诊断的。
使用链接的异常将低级别的异常转化为高级别的异常。
实际它所描述的是应用级异常和运行期异常必须分别对待。
为什么要区别对待呢? 实际上无论是应用级别异常还是系统级别异常我们都需要去处理的,并且最终反馈给调用客户端一定的信息。
不同的异常对应不同的信息,应用级别异常通常我们知道如何去处理以及给客户什么最终反馈信息,这时候我们可以参考你的例子程序中的MessageDAOException,它所表明的就是我知道这是个什么样的异常,以及告诉客户端响应的信息,但是运行期异常通常我们就无法预料,这时候我们通过基层RuntimeException以截获这类异常,一旦catch到就抛出去,这样调用端可以用这个异常来反馈给最终客户端一些信息, 比如,系统出现不可预料的异常、系统当机等。如果你截获了,并且忽略了这类异常显然对于调用者来说是致命的:客户端无法知道到底出什么情况了!
如何使DAO 更容易使用、更健壮及更易于维护,在实现 DAO 模式的异常处理时,一般我们都会考虑下面的问题:
1 DAO 的公共接口中的方法是否抛出检查过的异常?如果是的话,抛出何种检查过的异常?
2 在 DAO 实现类中如何处理异常?
在网上曾看到过一篇文章说,遵从以下这些原则可以极大地改进您的DAO :
1 DAO 方法应该抛出有意义的异常。
2 DAO 方法不应该抛出 java.lang.Exception ,不要让DAO方法传递关于底层问题的任何信息。
3 DAO 方法不应该抛出 java.sql.SQLException ,它是一个低级别的 JDBC 异常。一 个 DAO 应该力争封 装JDBC 而不是将 JDBC 公开给应用程序的其余部分,这本书就是通过使用ORM工具来做到这一点的。
4 只有在可以合理地预期调用者可以处理异常时,DAO 接口中的方法才应该抛出检查过的异常。如果调用者不能以有意义的方式处理这个异常,那么考虑抛出一个未检查的(运行时)异常。
5 考虑定义标准 DAO 异常类,在这里书中是通过自定义一个异常体系来实现的,当然我们也可以使用Spring框架 提供的一套预定义的 DAO 异常类。
对于这本书的小例子而言,很好地体现了上面的那些原则,达到了极大地改进DAO地目标,具体是这样做的:
首先是自定义了一个MessageException 对象,它是其它业务异常的父类,也是整个项目所有自定义异常的根。书中提到,之所以这样进行处理,是采取了整个Java系统在设计的时候使用的单根 (Object对象)的处理方法。因为在业务处理过程中,出现的问题都是由用户或者系统的原因造成的,而且是无法预先知道的,只有在运行时才能发现这些问 题,所以在这个定义的异常对象中继承了RuntimeException,如清单8
public class MessageException extends RuntimeException
...{
/** *//**
* Generated serialVersionUID
*/
private static final long serialVersionUID = 6905209869067708768L;
public MessageException( String message )
...{
super( message );
}
}
书中提到说在上面这个异常中没有定义任何特殊的方法,对于复杂的系统需要增加一些自己的方法,以便于进行数据和状态信息的传递。另外两个异常对象 MessageDAOException,MessageAuthorityException则属于具体的业务异常对象了。 MessageDAOException表示进行持久化时产生的异常,例如根据留言的ID去查找留言的信息,如果该留言对象不存在,那么就会抛出这个异 常。实现方法如清单9
public class MessageException extends RuntimeException
...{
/** *//**
* Generated serialVersionUID
*/
private static final long serialVersionUID = 6905209869067708768L;
public MessageException( String message )
...{
super( message );
}
}
MessageAuthorityException是与权限相关的异常,在进行权限校验失败时抛出这个异常。实现方法如清单10
public class MessageAuthorityException etends MessageException
...{
private static final long serialVersionUID = 1L;
public MessageAuthorityException(String message)
...{
super(message);
}
在这里,定义不同的异常是使我们可以把注意力放在应用级的层次上,捕获异常后可以采取不同的处理方法,进行不同的处理:
下面这个代码片段是来自清单 3. 的,这里在删除一条留言信息的时候,就调用了刚才定义的MessageDAOException
/**
* 删除留言信息
*
* @param id
* 要删除的留言信息的ID值
* @param userId
* 执行删除操作的用户ID
*/
public void deleteMessage(String id, String userId)
{
Message msg = getMessage(id);
if (msg == null)
{
throw new MessageDAOException(找不到你所要删除的留言!);
}
if (!msg.getUser().getId().equals(userId))
{
throw new MessageDAOException(你不能删除别人的留言!);
}
deleteObject(msg);
}
这 些就是定义系统异常时的处理结构,它的主导思想就是依据对异常处理方法的不同而定义不同类型的异常,依据每个异常所包含的信息不同来定义不同类型的异常。 在下一个笔记里就是讨论如何实现从一个工厂类里获得DAO接口的实现类,将会用到IOC容器的一种实现形式DI,这里不是采用Spring的IOC容器而 是自己实现一个简单的,当然,这种做法的目的,其实就是帮助我们更好地理解DIP,从而也对Spring的bean工厂有更好地理解~~~
分享到:
相关推荐
5. 异常的封装与日志记录:在统一异常处理中,通常会将捕获的异常封装成一个包含异常类型、异常消息、堆栈跟踪等信息的对象,然后记录到日志中。这不仅有助于开发者在出现问题时快速定位,也是系统监控和性能优化的...
本篇文章将深入探讨JDBC DAO的设计思想,以及如何结合Service层来构建一个完整的异常处理机制。 首先,理解JDBC DAO的基本概念。DAO模式的主要目标是提供一个接口,使得业务层可以与具体的数据库操作分离。这样,...
Sullivan 在其文章中探讨了 DAO 编程中三个常常被忽视但至关重要的方面:事务界定、异常处理以及日志记录。 #### 二、事务界定 事务界定是指在 DAO 操作中定义事务边界的过程,确保数据的一致性和完整性。事务是...
Spring Boot 提供了统一的异常处理机制,通过使用 @ControllerAdvice 和 @ExceptionHandler 注解,可以实现对控制器层、Service 层、Dao 层以及 Spring 系统内定义的部分异常的统一处理。 在 Spring Boot 中,可以...
DAO(Data Access Object)模式是一种常用的设计模式,它在Java编程中用于处理数据库交互。DAO的主要目标是将业务逻辑与数据访问层进行解耦,提高代码的可重用性和可测试性。在JDBC中,DAO模式的应用尤为常见,因为...
"java编程中异常处理的方法与技巧" java编程中异常处理的方法与技巧是java编程中非常重要的一部分。异常处理是指在编程过程中对可能出现的错误或异常情况的处理和解决方法。 java编程中有多种异常处理方法和技巧,...
异常处理是DAO中的另一个关键要素,因为它可以捕获并适当地响应在数据访问过程中可能出现的错误。良好的异常处理能确保系统的健壮性,并提供有用的反馈信息。在实现DAO时,应该考虑捕获和封装可能发生的数据库相关...
5. **异常处理**:在通用DAO中,通常会统一捕获并封装数据库操作中的异常,如`DataAccessException`,并向上抛出更具体的业务异常,以便服务层进行适当的错误处理和反馈。 6. **性能优化**:为了提高性能,通用DAO...
总结,"J2EE核心模式之DAO(简体中文)"涵盖了DAO模式在Java企业级应用开发中的重要性、实现方式、事务管理、异常处理、性能优化和测试策略等多个方面。通过深入学习和理解这些内容,开发者能够更有效地构建稳定、可...
在实现DAO时,有三个重要的方面需要考虑:事务界定、异常处理和日志记录。 **事务界定**是确保数据库操作原子性的关键。根据J2EE规范,有两种事务界定模型:编程式和声明式。编程式事务管理要求程序员在代码中明确...
本篇文章将深入探讨Struts2的异常处理策略,以及如何在DAO层进行单元测试配置。 在传统的Web应用中,当一个异常发生时,通常会跳转到错误页面或者返回错误信息。但在现代Web应用中,尤其是涉及到Ajax异步请求时,...
在Spring MVC框架中,异常处理是一项关键任务,它确保了应用程序在遇到错误或异常时能够以优雅的方式响应,提供统一的错误信息,并保持代码的整洁和模块化。本篇文章将详细探讨Spring MVC处理异常的三种主要方法:...
6. **异常处理**:DAO实现类通常会捕获并封装数据库操作中可能抛出的异常,然后转换为应用程序级别的异常,以便上层业务逻辑更好地处理错误。 DAO设计模式的优点: 1. **解耦**:DAO模式将数据访问代码与业务逻辑...
10. 异常处理:DAO实现中,可以统一处理数据库操作可能出现的异常,如SQLException,提供更友好的错误信息给上层应用。 总的来说,DAO模式在软件开发中扮演着至关重要的角色,它简化了数据库访问,提高了代码的...
6. **异常处理**:DAO层应该适当地处理可能出现的数据库异常,如`SQLException`,并转换为应用程序可以理解的自定义异常,以便上层业务逻辑能够更好地处理错误情况。 在"JDBCTest"这个文件中,很可能包含了一个基于...
4. **异常处理**: DAO操作可能抛出数据库相关的异常,如SQLException。这些异常需要被适当地捕获并转换为应用程序可以处理的业务异常,以便在Web层提供合适的错误信息给用户。 5. **性能优化**: DAO模式还可以...
4. **异常处理**:为了保证程序的健壮性,DAO类应包含适当的异常处理机制,捕获并处理可能抛出的数据库相关异常,如`SqlException`。 5. **注释**:在实例中,详细注释有助于理解每个方法的作用和实现细节,这对于...
在J2EE项目中,异常处理是一项至关重要的任务,它直接关系到系统的稳定性和用户体验。本文将详细解析几种常用的异常处理方案,尤其是针对Struts2框架下的异常管理策略。 #### 一、使用Struts2的拦截器进行异常处理 ...
3. **异常处理**:学习如何在源码中处理可能出现的数据库异常,如连接失败、SQL执行错误等。 4. **事务管理**:如果源码中涉及到事务,可以学习如何控制事务的开始、提交、回滚等操作。 5. **性能优化**:可能包含...
6. **异常处理**:在DAO实现中,我们应妥善处理可能出现的SQLException和其他异常,通常将其转化为应用程序级别的异常,如自定义的`DataAccessException`,以便在上层代码中能更方便地处理。 7. **连接池管理**:...