异常
受检异常
FileNotFoundException
ClassNotFoundException
SQLException
IOException
非受检异常
RunTimeException
Error
原则:受检异常,如果自身不能处理就往上抛
如果资源的打开,资源的使用,资源的关闭都封装处理,那么可以抛出运行时异常RunTimeException.[Spring的DAO封装].
如果资源的打开,资源的使用,资源的关闭在方法中未处理完成,那么可以抛出受检异常FileNotFound.[java的io文件操作]
抛出受检异常还是非受检异常?
对可恢复的情况使用受检异常,对编程错误使用运行时异常或错误[未受检异常].
未受检异常:如果程序抛出未受检异常或者错误,往往就属于不可恢复的情形,继续执行下去有害无益.[你实现在所有未受检的抛出结构都应该是运行时异常的子类.]
那么何时使用受检异常?
1. 如果正确地使用API并不能阻止这种异常条件的产生。[正确的使用DAO调用,不能阻止异常条件的产生,不使用受检异常][DataAccessException]
2. 一旦产生异常,使用API的程序员可以立即采取有用的动作,这种负担就被认为是正当的.[比如服务层调用失败应该受检异常,某个服务调用失败可能不会影响其他服务的调用][XXXException]
自定义的异常应该是受检还是未受检?
有一条原则是避免不必要的使用受检异常.受检异常可以声明它抛出这些异常,并让它们传播出来.[异常传播]
那么一般我们在设计接口的时候会考虑异常吗?肯定不会,因为接口是提供给外部调用的,接口的实现保持原子性,所以对资源的操作[打开,使用,关闭]都封装在接口的实现中.那么为了避免接口污染,不抛出异常.
例子:
Spring封装的dao操作已经把Exception封装为DataAccessException,此异常为运行时异常,不是受检异常,代码会非常的优雅.当然并不是所有的DAO操作异常都抛出
DataAccessException,而是先抛出它的子类: DataIntegrityViolationException[主键重复异常], TypeMismatchDataAccessException[类型错误]等等异常,采用异常子类来封装多异常类也是不错的选择.
那么使用Spring开发,DAO层的接口可以非常清晰
/**
* 根据服务id获取服务信息
**/
Public ServiceDO getServiceById(Long id);
那么Service层提供的接口也不需要考虑异常,因为DAO已经封装了数据库的交互,保持了DAO操作的原子性,所以Service层接口也会相当的简单.
/**
* 根据服务id获取服务信息
**/
Public ServiceDO getServiceById(Long id);
有人可能会问,这个DAO的接口与Service的接口一模一样,你不觉得蛋痛吗?
这是个问题啊,但是在领域模型中,这是不一样的概念.不知道下面有没有大侠有更好的解决方案[求教.]
我不建议这么做,嘿嘿,有人可能会问你在挑战Spring。在具体的业务逻辑操作,比如你可能会在N多地方调用getServiceById(Long Id).如果错误信息只有在DAO层抛出,你知道哪个业务调用出错了,所以采用异常往外抛的话,你会看到一条线.
DAOException[…],ServiceException[…],Action[…].一条很清晰的异常链.如此的话,你的DAO接口,Service接口设计就要如下:
/**
* 根据服务id获取服务信息
**/
Public ServiceDO getServiceById(Long id) throws DAOException;
如果采用这种方式抛出异常,那么在DAO层,Service层都必须封装Exception,无原无故多这些try..catch实在是蛋痛,不知道有没有哪位大侠有更好的建意。
分享到:
相关推荐
### 精通Java处理异常:深入理解与实践 在Java编程中,异常处理是确保程序稳定性和健壮性的重要机制。本文将深入探讨Java异常处理的核心概念、分类以及如何在实际开发中有效地管理和捕获异常,从而帮助开发者提升...
休闲程序空间趣说java处理异常的方式
* 异常处理的主要步骤是:抛出异常(throw) -> 捕捉异常(catch) -> 处理异常(finally)。 三、异常类的继承关系 * `Throwable` 是所有异常类的父类。 * `Error` 和 `Exception` 是 `Throwable` 的两个子类。 *...
Java异常处理是编程过程中的重要组成部分,特别是在大型项目或复杂系统中,良好的异常处理机制能够保证程序的稳定性和可维护性。本篇文章将深入探讨Java中的异常处理,帮助初学者理解这一关键概念。 异常...
在这个过程中,Java使用了try-catch语句块来捕获和处理异常。通过在一个或多个catch语句块中处理所有可能抛出的异常,可以实现全局异常统一处理。 例如,在Spring框架中,使用@ControllerAdvice和@ExceptionHandler...
java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理
第7章 java异常处理
2、处理异常:对捕获的异常进行处理,尽量恢复程序的正常运行。 3、记录异常:记录异常的信息,以便后续的分析和 debug。 4、测试异常:对异常处理逻辑进行测试,确保程序的健壮性。 四、设计一个异常处理的框架 ...
java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验
零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理...
异常链是Java处理异常的又一高级特性,它允许一个异常对象包含另一个异常的信息,从而在抛出新异常时能够提供更多的上下文信息。异常链通常用于异常转换,即在捕获一个异常后,抛出一个新的异常,同时将原始异常传递...
- **捕获异常(Catching)**:异常抛出后,Java虚拟机从发生异常的代码开始,向上回溯调用栈,寻找合适的`catch`块来处理异常。如果找到,就执行对应的异常处理代码。 5. **异常类的层次结构**: Java的异常类...
Java异常处理的核心是使用`try-catch`块来捕获和处理异常。`try`块包含可能会抛出异常的代码,如果在`try`块中发生异常,控制流会立即跳转到相应的`catch`块,执行对应的异常处理代码。例如: ```java try { // ...
Java异常处理是编程中至关重要的一个环节,它允许开发者优雅地处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java中的异常处理机制基于一个独特的概念——异常(Exception),这是一种表示程序运行中...
对于异常处理,Java提供了异常类层次结构,允许捕获和处理不同类型的异常。常见的内存错误包括`java.lang.OutOfMemoryError: Heap space`(堆空间不足)、`java.lang.OutOfMemoryError: PermGen space`(方法区空间...
在本实验中,你会学习如何在代码中使用`try-catch-finally`结构来处理异常,并结合log4j进行日志记录。这包括设置log4j配置文件,创建Logger对象,以及在不同日志级别下记录信息。理解这些基本操作后,你将能够更好...
Java处理异常的机制关键字throw和throws使用解析 Java处理异常的机制关键字throw和throws是Java语言中两个非常重要的机制关键字,它们都是用来处理异常的,但它们之间存在着明显的区别。下面我们将通过示例代码详细...
本文将对C++和Java两种语言的异常处理机制进行深入的比较和分析,探讨它们的相似之处以及不同之处,以帮助开发者更好地理解和应用这两种语言。 首先,异常处理的基本目的是捕获并处理运行时错误,这些错误通常包括...
Java异常处理是编程中至关重要的一个环节,它用于管理和恢复程序在执行过程中可能出现的问题。Java异常分为两大类:错误(Error)和异常(Exception)。错误通常指的是系统级别的问题,如JVM内部错误或资源耗尽,...