Java 从hibernate DAO实现中抛出有意义的异常

Java 从hibernate DAO实现中抛出有意义的异常,java,hibernate,dao,Java,Hibernate,Dao,在我的web应用程序(jsp+hibernate+hsqldb on tomcat)代码中,我使用了两个Dao实现。基类Dao实现包含所有会话打开和关闭逻辑。许多特定于域的Dao类扩展了这个基类,以提供特定的find()、delete()方法 我想在出现错误时给用户提供有意义的消息,而不是error500消息。 由于基类方法使用hibernate.Session类作为get()、saveOrUpdate()方法,因此它们抛出HibernateException。特定于域的子类需要捕获该异常,并将

在我的web应用程序(jsp+hibernate+hsqldb on tomcat)代码中,我使用了两个Dao实现。基类Dao实现包含所有会话打开和关闭逻辑。许多特定于域的Dao类扩展了这个基类,以提供特定的find()、delete()方法

我想在出现错误时给用户提供有意义的消息,而不是error500消息。 由于基类方法使用hibernate.Session类作为get()、saveOrUpdate()方法,因此它们抛出HibernateException。特定于域的子类需要捕获该异常,并将其包装在某个自定义异常中,然后重新播放

我试过这样做我不知道这样做是否正确我欢迎你的意见/建议

真诚地

吉姆

特定于域的dao是

class SaleOrderDao extends BaseDao{
    public SaleOrderDao() {
        super(SaleOrder.class);
    }
    @Override
   public SaleOrder findSaleOrderById(Long saleOrderId){            
            SaleOrder so =  (SaleOrder)findById(saleOrderId);
            return  so;

    }
    @Override
    public void saveOrUpdateSaleOrder(SaleOrder so){
         try{
                saveOrUpdate( so);
          }catch(HibernateException e){
              String msg = "could not insert/update saleorder"+so.getSONumber();
               throw new SaleOrderDaoException(msg+"/ "+e.getMessgae());
           }
        }

     }

您确定客户想要有意义的信息吗?我认为有意义的错误应该出现在业务错误的情况下。对于技术(读取、意外)错误,客户应该只看到一般错误页面,可能带有错误参考代码,但仅此而已

代码的另一个问题是您将在错误消息中包含e.getMessage。这并不好,因为该消息可能包含一些技术信息,这些信息可能有助于入侵您的系统。但是,也就是说,日志必须有尽可能多的关于错误的信息(在合理的范围内,不应该有密码、卡的详细信息)


因此,技术错误的基本规则应尽可能向客户展示。业务错误是另一回事,在这里您应该尽可能清楚。

我认为在方法签名中抛出异常更好,这样就不需要重新抛出异常,并且您将限制在try catch中使用方法。感谢您的回复。目前大多数与db相关的错误都会导致error500消息。因此,我想我会改变一点,我想提高投票率,但名声不好
class SaleOrderDao extends BaseDao{
    public SaleOrderDao() {
        super(SaleOrder.class);
    }
    @Override
   public SaleOrder findSaleOrderById(Long saleOrderId){            
            SaleOrder so =  (SaleOrder)findById(saleOrderId);
            return  so;

    }
    @Override
    public void saveOrUpdateSaleOrder(SaleOrder so){
         try{
                saveOrUpdate( so);
          }catch(HibernateException e){
              String msg = "could not insert/update saleorder"+so.getSONumber();
               throw new SaleOrderDaoException(msg+"/ "+e.getMessgae());
           }
        }

     }