为什么我们在hibernate中捕获Exception类?

时间:2017-08-27 11:31:45

标签: java hibernate exception

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

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");

3 个答案:

答案 0 :(得分:0)

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

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

此外,您可能有一个高级功能的捕获,可能会以错误的方式处理此类异常,例如期望一些不同的参数为null

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

如果查询结果不可用,那么是否因为数据库关闭或编程错误并不重要。反应通常是一样的。将错误消息发送给用户,或使用默认值。记录错误,然后继续下一个请求。

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