【问题标题】:Why do we catch Exception class in hibernate?为什么我们在休眠中捕获异常类?
【发布时间】:2018-02-04 20:48:37
【问题描述】:

为什么我们必须在catch中使用,如果这个类包含错误(如java虚拟机异常)或异常如NullPointerException......这些异常是未经检查的异常。我在互联网上找到了示例,但我不明白为什么有必要在此代码中使用异常。为什么我们不捕获绑定到休眠框架的异常?

try{
          Session session = sessionFactory.getCurrentSession();
          Criteria criteria = session.createCriteria(Student.class);
          criteria.add(Restrictions.eq("pk.stud.id",idStude));
          carte = (List<StudentC>) criteria.list();
      }catch(Exception e){
          System.out.println("\n"+e.toString()+" "+e.getMessage()+"\n");
      }
      System.out.println("\nENTER UnivDAO \n");

【问题讨论】:

  • 这取决于.. 如果数据库关闭了怎么办?如果数据库存在临时问题怎么办?如果您添加的标准无效怎么办? SQLException 是需要处理的。

标签: java hibernate exception


【解决方案1】:

您的hibernate 代码正在访问数据库并且可以更新/删除/锁定记录。

如果您的代码在没有捕获的情况下抛出unchecked exception,则数据库连接可能会保持打开状态,并可能导致连接泄漏甚至锁定数据库记录。

此外,您可能在高级函数中有一个 catch 可能会以错误的方式处理此类异常,例如期望一些不同的参数为空

【讨论】:

    【解决方案2】:

    关键是这样的代码可能会抛出一整套不同的检查异常类型。

    该 API 的作者没有要求您捕获这 5 个不同的异常,而是决定将操作减少为“抛出异常”。这减少了双方的努力——投掷列表现在更容易管理。但缺点是你会丢失一些关于实际情况的信息。

    这是一种常见的做法。有时这是个好主意,有时不是。

    【讨论】:

      【解决方案3】:

      不必捕获该代码周围的任何异常。许多示例捕获异常只是为了演示抛出了哪些异常。该示例可能在 try/catch 块之后将carte 设置为null 或一个空列表,这只会导致引发更多异常或返回无效结果。相反,应该抛出异常,并在更高级别(可能在请求级别)进行处理。

      如果查询结果不可用,那么无论是因为数据库关闭还是编程错误都无关紧要。响应通常是相同的。向用户发送错误消息,或使用默认值。错误已记录,然后您继续下一个请求。

      同样在示例中,调用System.oute.getMessage() 意味着我们会丢失很多关于异常发生地点或时间的信息。它并不打算在实际代码中使用,而是应该将异常发送到记录器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多