2012-01-18 35 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塊方法相反。