二 基于Spring的异常体系处理

阅读更多

1.Spring的DAO异常体系

Spring在DAO层建立了一套面向DAO层统一的异常体系,同时将各种访问数据的检查型异常转换为非检查型异常,为整合各种持久层框架(spring JDBC,Hibernate,ibatis)提供基础。


二 基于Spring的异常体系处理_第1张图片
 Spring将DAO层进行了封装,形成统一的异常体系架构,其基类为DataAccessException。

2、基于spring的JEE体系架构异常处理方案

      程序中对于异常的处理,应遵循一个原则,那就是能处理的异常要处理,不能处理的异常要抛出去,二不能隐藏或遗漏异常的处理。同时,针对抛出的异常,我们应根据类型分为应用异常和系统异常。

      应用异常是由于违反相关的业务逻辑而导致的错误。该错误不是致命的错误,可把错误信息报告给用户,来提醒用户,用户可通过重新操作来完成预期的业务。针对应用系统异常,应划分更详细的子异常,以满足业务的需要才是有意义的。

      系统异常是程序系统发生的bug错误或出现的致命错误,此时必须终止服务,抛出错误。即使用户再重复操作,也不能完成业务将受限,是后台管理员关注的。

      针对这种情况,我们可以定义如下的异常:
二 基于Spring的异常体系处理_第2张图片
 (1)数据层异常

     spring框架提供了统一的DAO异常处理架构,其基类为DataAccessException。分析下数据库的操作和抛出的DataAccessException子类,以区分哪些是应用异常,哪些是系统异常。

      插入操作:应抛出DuplicateKeyException(应用异常)和DataAccessException(系统异常)。

      查询操作:findbyPrimarykey 应抛出ObjectNotFoundException(应用异常)和DataAccessException(系统异常)。count应抛出DataAccessException(系统异常)。

      更新操作:应抛出ObjectNotFoundException(应用异常)DuplicateKeyException(应用异常)和DataAccessException(系统异常)。

      删除操作:应抛出ObjectNotFoundException(应用异常)和DataAccessException(系统异常)。

spring的DAO层异常架构将异常统一为非检查异常。我们在DAO层的代码中可以将上述的异常抛出,也可以不做异常处理,但在业务层的处理中必须将这些异常捕获出来转换为我们定义的应用异常和系统异常。

      下面的代码都可以接受:

public addUser(User){

框架集成接口

}

 

public addUser(user)throws DuplicateKeyException,DataAccessExceptiom{

//orm框架接口操作

}

 (2)业务层异常处理

       业务层中,通过异常链保存原始异常信息。程序员必须自己编码来保存原始异常的信息。在业务逻辑中,捕获DataAccessException异常,处理包装成SystemException异常抛出。捕获ObjectNotFoundException,DuplicateKeyException异常,处理包装成BusinessException异常抛出。业务层中应根据业务的不同,将异常尽量分得细一点,否则,自定义的异常没有太多的意义。

      业务层异常处理代码如下:

public addUser(User user) throws BusinessException,SystemException{
        try{
              userDao.addUser(user);
        }catch(DuplicatekeyException ex){
             log.infor("......................");
             throw new BusinessException(ex.getCause(),"国际化信息");
        }catch(DataAccessException ex){
             log.error("......................");
             throw new SystemException(ex.getCause(),"国际化信息");
        }
}

 (3) 表现层异常处理

      在控制层,我们需要将通过try..catch方法进行捕获异常,经行包装处理,保存异常信息,将错误信息同时转到error页面。下面以spring MVC方式举例说明异常页面的处理。

      I. 公共页面403,404. 405,500错误需要配置在web.xml中

web.xml配置如下:



  SpringExceptionResearch
	
	
	
	
		log4jConfigLocation
		classpath:log4j.xml
	
	
	
	
		log4jRefreshInterval
		60000
	

	
	
	
	
	
		contextConfigLocation
		classpath:applicationContext.xml
	
	
	
		org.springframework.web.util.Log4jConfigListener
	
	
		org.springframework.web.context.ContextLoaderListener
	
	
		org.springframework.web.util.IntrospectorCleanupListener
	
	
	
	
	
		CharacterEncodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
		
			forceEncoding
			true
		
	
	
		CharacterEncodingFilter
		/*
	
	
	
	
		SpringExceptionResearch
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:spring/applicationContext-servlet.xml
		
		1
	
	
	
	
	
		SpringExceptionResearch
		*.html
	
	
		index.html
 	
	
		403
		/WEB-INF/pages/error/403.jsp
	
	
		404
		/WEB-INF/pages/error/404.jsp
	
	
		405
		/WEB-INF/pages/error/405.jsp
	
	
		500
		/WEB-INF/pages/error/500.jsp
	

 2、在dispatch对应的MVC xml配置如下



			
	
	
	
	
	
	
	
	
	
	
    
    
	
	  
	      
	          
	              
	                  
						300
						60
						0123456789
						4 
	                  
	              
	          
	      
	
	
	
	
		
		 
	     	 
			  error/500 
	          error/errorpage 
	        
	   	
		
		
		
		
		
		 
	
	

	
	
    
         
            
                
                
                      
                          text/html;charset=UTF-8   
                        
                   
                
            
   	   
    
	
	
    

 

 

 

  • 二 基于Spring的异常体系处理_第3张图片
  • 大小: 15.7 KB
  • 二 基于Spring的异常体系处理_第4张图片
  • 大小: 9.6 KB
  • 查看图片附件

你可能感兴趣的:(二 基于Spring的异常体系处理)