`

集成spring框架的统一异常处理

阅读更多

JDBC的异常转换器 
    传统的JDBC API在发生几乎所有的数据操作问题都抛出相同的SQLException,它将异常的细节性信息封装在异常属性中,所以如果希望了解异常的具体原因,你必须分析异常对象的信息。 

    SQLException拥有两个代表异常具体原因的属性:错误码和SQL状态码,前者是数据库相关的,可通过getErrorCode()返回,其值的类型是int;而后者是一个标准的错误代码,可通过getSQLState()返回,是一个String类型的值,由5字符组成。 

     Spring根据错误码和SQL状态码信息将SQLExeption翻译成Spring DAO的异常体系。在org.springframework.jdbc.support包中定义了SQLExceptionTranslator接口,该接口的两个实现类SQLErrorCodeSQLExceptionTranslator和SQLStateSQLExceptionTranslator分别负责处理SQLException中错误代码和SQL状态码的翻译工作。将SQLException翻译成Spring DAO异常体系的工作是比较艰辛的,但Spring框架替我们完成这项艰巨的工作并保证转换的正确性,我们有充分的理由依赖这个转换的正确性。

      spring这样做主要有2个作用,一是统一建立spring框架的异常框架体系,使得不同的异常最后都封装转换成spring异常体系框架中,这个框架体系分类很详细,这样对问题也比较好定位。

      二是使得spring对底层异常保持独立,涡轮采用什么样的dao层,都不影响spring的异常体系。

 

    异常的基本概念:

1.RuntimeException,也就是运行时异常,表示你的代码本身存在BUG,比如你提到的ArrayIndexOutOfBoundsException,数组下标越界,这个属于代码有问题,数组定义的长度不够实际使用,不处理肯定会报错,如果你操作某个模块发现能正常运行,那只是因为代码还没跑到这个错误的地方而已。。控制台一旦报RuntimeException,就必须要处理。。没有例外的。而且,处理RuntimeException,不是try-catch能解决的。。try-catch在这里使用毫无意义。
2.不是RuntimeException,就是编译时异常,异常只有这两种了。比如你在处理文件流时的I/O问题,就属于编译时异常。这个时候用thr{}catch 来捕获或者 throws即可。
3.error,就不在这里赘述了

实现代码:

import org.springframework.dao.ConcurrencyFailureException;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.PermissionDeniedDataAccessException;
import org.springframework.dao.RecoverableDataAccessException;
import org.springframework.dao.TransientDataAccessResourceException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.jdbc.UncategorizedSQLException;

/**
 * 统一捕获异常
 * @author zhengjunxiang
 *
 */
public class CaptureException {
	
	//处理异常方法
	private void catchException(){
		try{
			
		}catch(BadSqlGrammarException e1){//NonTransient
			/**
			 * Exception thrown when SQL specified is invalid. Such exceptions always have
			 * a <code>java.sql.SQLException</code> root cause.
			 *
			 * <p>It would be possible to have subclasses for no such table, no such column etc.
			 * A custom SQLExceptionTranslator could create such more specific exceptions,
			 * without affecting code using this class.
			 *
			 * @author Rod Johnson
			 * @see InvalidResultSetAccessException
			 */
		}catch(DataIntegrityViolationException e2){
			/**
			 * Exception thrown when an attempt to insert or update data
			 * results in violation of an integrity constraint. Note that this
			 * is not purely a relational concept; unique primary keys are
			 * required by most database types.
			 *
			 * @author Rod Johnson
			 */
		}catch(DataAccessResourceFailureException e3){
			/**
			 * Data access exception thrown when a resource fails completely:
			 * for example, if we can't connect to a database using JDBC.
			 *
			 * @author Rod Johnson
			 * @author Thomas Risberg
			 */
		}catch(PermissionDeniedDataAccessException e5){
			/**
			 * Exception thrown when the underlying resource denied a permission
			 * to access a specific element, such as a specific database table.
			 *
			 * @author Juergen Hoeller
			 * @since 2.0
			 */
		}catch(ConcurrencyFailureException e6){//Transient
			/**
			 * Exception thrown on concurrency failure.
			 *
			 * <p>This exception should be subclassed to indicate the type of failure:
			 * optimistic locking, failure to acquire lock, etc.
			 *
			 * @author Thomas Risberg
			 * @since 1.1
			 * @see OptimisticLockingFailureException
			 * @see PessimisticLockingFailureException
			 * @see CannotAcquireLockException
			 * @see DeadlockLoserDataAccessException
			 */
		}catch(TransientDataAccessResourceException e7){
			/**
			 * Data access exception thrown when a resource fails temporarily
			 * and the operation can be retried.
			 *
			 * @author Thomas Risberg
			 * @since 2.5
			 * @see java.sql.SQLTransientConnectionException
			 */
		}catch(RecoverableDataAccessException e8){//Recoverable
			/**
			 * Data access exception thrown when a previously failed operation might be able
			 * to succeed if the application performs some recovery steps and retries the entire
			 * transaction or in the case of a distributed transaction, the transaction branch.
			 * At a minimum, the recovery operation must include closing the current connection
			 * and getting a new connection.
			 *
			 * @author Thomas Risberg
			 * @since 2.5
			 * @see java.sql.SQLRecoverableException
			 */
		}catch(UncategorizedSQLException e9){
			/**
			 * Exception thrown when we can't classify a SQLException into 
			 * one of our generic data access exceptions.
			 *
			 * @author Rod Johnson
			 * @author Juergen Hoeller
			 */
		}catch(DataAccessException e10){	//所以异常的基类,下包括事务异常和非事务异常,以上是spring抛出的SqlException异常
			/**
			 * Root of the hierarchy of data access exceptions discussed in
			 * <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0764543857/">Expert One-On-One J2EE Design and Development</a>.
			 * Please see Chapter 9 of this book for detailed discussion of the
			 * motivation for this package.
			 *
			 * <p>This exception hierarchy aims to let user code find and handle the
			 * kind of error encountered without knowing the details of the particular
			 * data access API in use (e.g. JDBC). Thus it is possible to react to an
			 * optimistic locking failure without knowing that JDBC is being used.
			 *
			 * <p>As this class is a runtime exception, there is no need for user code
			 * to catch it or subclasses if any error is to be considered fatal
			 * (the usual case).
			 *
			 * @author Rod Johnson
			 */
		}catch(NumberFormatException nfe){
			/**
			 * 数字转换异常
			 */
		}catch(Throwable e){
			/**
			 * 异常的最基类
			 */
		}
	}
	
}
分享到:
评论

相关推荐

    springboot整合thymeleaf+maven实现异常处理页面

    SpringBoot 是一个基于 Spring 框架的快速开发工具,它简化了配置并集成了大量常用的第三方库,如数据访问、安全、缓存等。Thymeleaf 是一个现代服务器端 HTML 模板引擎,特别适合与 SpringMVC 结合使用,提供动态...

    Spring框架基础总结

    4. **AOP技术**:Spring框架集成了AOP技术,使得诸如权限拦截、运行时监控等功能的实现变得异常简单,进一步增强了应用程序的功能性和安全性。 5. **辅助类支持**:Spring框架提供了一系列辅助类,可以帮助开发者...

    springboot+redis+shiro单点登录,统一异常处理,统一日志

    2. **统一异常处理**: - SpringBoot提供了一种全局异常处理机制,可以通过@ControllerAdvice或@ExceptionHandler注解创建一个处理类,捕获并统一处理所有控制器可能出现的异常。 - 异常处理类中可以定义各种异常...

    后端异常统一处理解决方案

    因此,统一异常处理是必要的,以实现更高效的故障排查和用户体验。 博客中提到的解决方案可能是通过自定义全局异常处理器实现的。在Spring Boot中,我们可以创建一个实现了`ErrorController`接口的类,或者定义一个...

    struts+spring集成

    7. **异常处理**:Spring提供了全局异常处理机制,可以捕获并处理Struts2中抛出的异常,提供统一的错误页面或者返回JSON格式的错误信息。 8. **国际化**:Struts2和Spring都可以支持国际化,集成后可以更好地协调这...

    spring 框架源码

    13. **异常处理**:Spring MVC提供全局异常处理机制,可以统一处理应用程序中抛出的异常。 14. **测试支持**:Spring提供MockMVC工具,可以在不运行整个Web服务器的情况下,对Spring MVC应用程序进行单元测试和集成...

    传智播客 spring框架2016版资料

    5. **Spring JDBC**和**JPA**:Spring提供了对数据库操作的支持,包括JDBC抽象层,简化了SQL的编写和异常处理。同时,Spring也支持Java Persistence API(JPA),提供了一种标准的方式来访问和操作持久化数据。 6. ...

    Spring MVC学习框架

    10. **异常处理**:Spring MVC 提供了统一的异常处理机制,通过 @ExceptionHandler 或配置 ExceptionResolver,可以优雅地处理应用中的异常。 11. **RESTful 支持**:Spring MVC 通过 @RequestMapping 注解支持 ...

    Spring Boot集成Mybatis附加自动生成工具,异常信息处理等工具类,拦截器,最全框架

    项目可能采用了Spring Boot的全局异常处理机制,通过实现`ErrorAttributes`接口和定义`@ControllerAdvice`注解的类,可以捕获并统一处理所有控制器级别的异常,返回格式化的错误信息,增强系统的健壮性。 拦截器...

    apache wink集成spring 开发rest服务

    结合Spring的异常翻译机制,可以实现统一的异常处理策略。 7. **测试**:Spring的MockMVC可以与Wink集成,用于单元测试和集成测试REST服务。这样可以在不实际发送HTTP请求的情况下,模拟客户端和服务器的交互。 8....

    详细介绍Spring框架.docx

    **Spring的优点** 包括但不限于:提高代码可测试性(通过依赖注入和接口编程)、降低组件之间的耦合、简化事务管理、支持多种数据访问策略、促进模块化和解耦、提供统一的异常处理机制以及增强应用的可扩展性。...

    Spring教程 spring tutorial

    7. **异常处理**:提供了强大的异常处理机制,简化了异常处理代码。 8. **国际化(I18N)支持**:支持多语言应用程序,方便进行国际化和本地化。 #### Spring框架的发展历程 - **2003年6月**:Spring框架由Rod ...

    STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)

    创建一个全面的Spring Boot应用,涵盖了多个关键领域,包括RESTful接口、数据库交互、用户认证、分布式Token的实现(JWT)、Redis缓存操作、日志记录以及统一异常处理。下面将详细阐述这些知识点。 1. **Spring ...

    Spring与Hibernate集成---声明式事务

    Spring框架是一个全面的企业级应用开发框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能,简化了Java应用的复杂性。另一方面,Hibernate是一个对象关系映射(ORM)框架,允许开发者用Java对象来操作数据库...

    springcloud集成flowable6.5.0适配达梦数据库的模块

    4. 异常处理:由于达梦数据库的异常处理机制可能与标准JDBC有所不同,需要在代码中适当地捕获和处理。 最后,关于Spring Cloud的集成,我们需要考虑以下几点: 1. 服务注册与发现:使用Eureka或Consul等服务注册与...

    spring boot aop 统一处理日志

    本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志的统一处理。 首先,我们需要了解AOP的基本概念。AOP允许程序员定义“切面”,它是一个包含业务逻辑和元数据的模块,可以跨越多个对象进行分布。在Spring中...

    业务异常提示处理 springboot+Assert(自定义断言)

    这允许我们在一个地方捕获并处理所有控制器层的异常,统一返回格式化的错误信息,同时记录日志,提高系统的异常处理能力。 5. **日志打印**:在业务异常发生时,详细的日志记录有助于定位问题。Spring Boot集成了...

    spring4框架系列[ 2 ]

    同时,Spring Data 提供了一套统一的接口,用于操作各种数据存储,如 JPA、MongoDB等。 6. **Spring Boot** 虽然不在 Spring 4.x 的范畴内,但 Spring Boot 在这个时期已经兴起,它简化了 Spring 应用的启动和配置...

    Spring框架+Spring工作原理+AOP面向切面编程+JDK代理+Cglib代理

    4. **Spring DAO**:提供了一套JDBC异常层次结构,简化了异常处理,同时还提供了事务管理支持。 5. **Spring Context**:建立在core之上,提供了与环境相关的支持,比如资源加载、事件传播和国际化。 6. **Spring ...

Global site tag (gtag.js) - Google Analytics