`

SSH4项目异常处理实践(一)

 
阅读更多

 

异常处理的作用


      (1)系统出问题后,方便开发人员快速定位和找到问题。


      (2)最好使用细粒度的自定义异常,人性化提示和处理。

 

 

DAO层的异常处理。

 

       1.SSH4框架抛出异常,DAO层无需再显式抛出。DataAccessException 和 HibernateException都是运行时异常(unchecked非检测型异常)
           (1)DAO 使用Hibernate3时,Spring提供继承HibernateDaoSupport,获得getHibernateTemplate().
                 默认抛出org.springframework.dao.DataAccessException异常(getHibernateTemplate()方法抛出的)

 

           (2)DAO 使用Hibernate4时,Spring不提供HibernateDaoSupport,自己写的模板getSessionFactory().getCurrentSession()实现
                默认抛出org.hibernate.HibernateException异常

  
       2.DAO 的异常被上面两个异常之一封装,不会再抛出SqlException(检测型异常),所以即使接口中抛出SqlException也捕捉不到。
           即使抛出也没意义,因为service层处理不了这异常。

           所以DAO层的异常通常不处理(不throws 也不try-catch) ,要抛出的只是自定义异常(业务需要时)。


Service层的异常处理  :需要定义业务异常类,对异常进行细分。

 

   1.除了调用了抛checked的异常的方法外,没必要在每个方法后都加throws Exception或者throws XXXException,
     因为没有意义,加不加如果出异常了都会往上抛出。

 

   2.即使调用了抛checked的异常的方法,也最好try-catch处理,转化成自定义的业务异常。

 

   3.业务异常BusinessException定义成继承runtimeExeption。也不需要
      写法是:
 

             //业务代码
               if(业务状态){

                throw new BusinessException("XXXX");

               }

 
      如果方法中调用了抛checked的异常的方法抛出了xxxException:
    

        try{

             }cath(xxxException  e){
               //转化成业务异常
               throw new BusinessException("XXXX",e);
               //throw new BusinessException("XXXX");--不推荐,因为这样的话就丢失了异常堆栈信息
             }

 
          
   4.spring事务管理默认回滚条件是runtimeExcetion,因为SQLException等异常被转化成了HibernateException或者DataAccessException,都属于runtimeExeption异常。
     如果希望设置为Checked异常也可以配置实现:<tx:method name="*" rollback-for="java.lang.Exception"/>

     但是不推荐,Spring和Hibernate对Dao层异常的处理都倾向于使用runtimeExeption异常,因为调用者能抛出或者catch,但是并不能解决问题。
 

   5. 需要注意:从Hibernate 3.X.X版本(不知道具体版本)开始HibernateException定义成RunTimeException异常。
             所以,对于低版本的Hibernate,由于HibernateException异常含有(或属于)Checked异常,
             需要注意下因为抛出的是checked异常导致事务不会回滚的情况。

 

Action层的异常处理

 

   只捕获自定义应用异常,其他异常可以上抛(不管它不使用throws 也不try-catch,其实也是上抛),也可以封装成errorMessage。
            Action层的异常,是上抛给Struts2框架,通过配置文件配置跳转的页面,还是直接转化成errorMessage返回给用户,需要看情况。
           即:给用户看到的是一个提示,还是一个错误提示的页面,可以自己选择。

          action层日志
             1.Struts2提供了异常拦截器,拦截器会将定义的异常捕获,记录日志,然后根据配置的异常的类型顺序跳转到相应的页面。
             2.如果觉得Struts2自己的异常拦截器不够完善,可以自己写个异常拦截器。这也是一劳永逸的做法。
             3.灵活日志的做法是每个action中都new一个logger对象,直接记录日志,不过需要自己编码,可能有人觉得复杂。

 

3个日志

 

        系统运行日志:记录系统的运行情况,跟踪代码运行时轨迹;

       异常和错误日志:记录异常堆栈信息,以供开发人员查看分析;

       业务日志:记录业务信息和用户操作,例如用户登录、删除数据、更新数据等。
                        哪些操作需要产生操作日志,可以做成配置,甚至把用户IP、登录名、系统、时间、操作等保存到数据库。

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics