2012-01-18 38 views
2

如下所示,有两次尝试抓取有什么好处?从书开始休眠采取。使用两个try-catch?

protected void rollback() { 
     try { 
      getSession().getTransaction().rollback(); 
     } catch (HibernateException e) { 
      // TODO change to log 
      System.out.println(e); 
     } 

     try { 
      getSession().close(); 
     } catch (HibernateException e) { 
      // TODO change to log 
      System.out.println(e); 
     } 
    } 
+1

大概是因为你想关闭会话,而不管操作是否成功。 – Nim 2012-01-18 12:58:50

+3

为什么你不使用finally块? – Mob 2012-01-18 13:25:27

回答

4

它保证close()将被调用,即使rollback()抛出异常。

+2

最好在finally块上使用close()来达到这个目的。 – Victor 2012-01-18 13:03:15

+1

@Victor,说谁? – mre 2012-01-18 13:03:45

+0

@mre万一从rollbadk抛出的异常不是HibernateException,例如任何RuntimeException – 2012-01-18 13:07:22

0

没有,真的。如果你用

protected void rollback() { 
     try { 
      getSession().getTransaction().rollback(); 
      getSession().close(); 
     } catch (HibernateException e) { 
      // TODO change to log 
      System.out.println(e); 
     } 
    } 

替换你的代码,你仍然可以得到几乎相同的信息。有一些微小的差异:

在第一种情况下,行getSession().close();仍然会被调用,即使getSession().getTransaction().rollback();引发异常,而在我的例子中它不会。然而,处理这个问题的正确方法是使用finally块,如果你想要.close()行被调用,不管是什么。

+0

不需要最后,你可能想要捕获'close()'操作过程中抛出的任何异常。 – Nim 2012-01-18 13:01:43

+0

尽管如此,你仍然需要在finally块中使用try-catch。这只是使方法更加冗长。 – mre 2012-01-18 13:02:10

+0

不是真的,如果您的最后一个.close()操作引发了一个异常,您并不想真正想知道,因为没有真正的好方法可以从中恢复。然而,我同意这只是一个品味问题。 – 2012-01-18 13:03:31

2

最初的目的是关闭会话,即使rollback()方法抛出异常但该解决方案不够好。

如果的roolback抛出RuntimeException收盘代码将永远不会被调用

你应该做到以下几点:

protected void rollback() { 
     try { 
      getSession().getTransaction().rollback(); 
     } catch (HibernateException e) { 
      // TODO change to log 
      System.out.println(e); 
     } finally { 
      try { 
       getSession().close(); 
      } catch (HibernateException e) { 
       // TODO change to log 
       System.out.println(e); 
      } 
     } 
    } 

这确保了密切的代码将被无论什么所谓。

+0

@Chin Boon作为一种惯例,您应该在“finally”块中执行“close()”操作,以确保它始终得到执行。这个代码块可以自己拥有自己的try-catch块。 – Napte 2012-01-18 13:59:27

0

原因是这些部分之间的独立性。这两个部分可能独立失败。 (并独立处理)。 'rollback'调用失败并不会阻止'close'语句的执行,这与本案例中的单个try-catch块方法相反。