2015-10-08 36 views
0

我也接觸過一段代碼,看起來像這樣嵌套try塊 - 這有用嗎?

try 
{ 
    try (SomeResource res = new SomeResource()) 
    { 
     // "\(o.o)/" *BOO* 
    } 
} 
catch (SomeException e) 
{ 
    e.letsNotIgnoreTheException(); 
} 

我想不出理由只有一個使用兩個試塊。沒有人問我可以想到一個。

我離開了懷疑,這是否僅僅是 需要一些重構的梅索德,或者如果確實發生了一些要用到的外試(尤其是因爲我發現了好幾次,但話又說回來, 有人可能只是誤解了試用資源)。

回答

3

鑑於有沒有多餘的流量的控制或嘗試在你真正的代碼結構,你的代碼是相同的:

try (SomeResource res = new SomeResource()) { 
     // "\(o.o)/" *BOO* 
    } catch (SomeException e) { 
     e.letsNotIgnoreThisException(); 
    } 

請注意:

  • 試-with-resources在異常處理之前執行res.close()
  • 因此e.letsNotIgnoreThisException()在之後被調用 res.close()
  • 必須處理由*BOO*行引發的任何其他異常。捕獲或聲明的)適當

解釋試穿與資源的資源關閉和異常處理的執行順序的鍵線說明如下:

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

報價:

注意:try-with-resources語句可以像普通的try語句一樣具有catch和finally塊。在try-with-resources語句中,任何catch或finally塊都在聲明的資源關閉後運行。

0

如果外面的try-catch具有裏面什麼也沒有,除了內嘗試,那麼它的,因爲沒有必要你可以將它們合併成一個。但是,如果外部try-catch具有其他內容,則語義可能不同。

0

反駁:

這不是單個try塊執行不同 - 在try-與資源轉化爲在finally塊,其中執行 catch塊關閉資源,而嘗試,用 - 嵌套的try塊中的資源在外部catch塊之前執行

如果要在執行catch塊之前關閉SomeResource資源,這可能很有用。

例如,如果您在文件中寫入某些內容,並且錯誤地想要刪除該文件內容並將錯誤消息寫入相同的文件(我知道是虛擬示例),則可以通過關閉資源首先,刪除文件並在新的流/資源中寫入錯誤。

+2

Jiri,這是我的第一個推測,但我測試了它,這是不正確的 - 嘗試與資源是*不*就像一個finally塊一樣,資源在** catch和finally之前關閉**。請參閱文本「任何catch或finally塊在聲明的資源已關閉後運行」。在oracle文檔中... – vikingsteve

+1

@vikingsteve我站在更正,謝謝你指出我。 –

+1

不用擔心。這實際上改變了我的理解,因爲嘗試資源不是*「技術上」*與最終塊相同,儘管在大多數情況下它不應該是重要的。我今天也學到了一些新東西:) – vikingsteve

0

當訪問數據庫時,這種模式通常會發生 - 主要是爲了確保資源正確關閉,而且還要在處理每條記錄時處理錯誤而不停止查詢。

try { 
     ResultSet rs = query.executeQuery(); 
     try { 
      // Each row. 
      while (rs.next()) { 
       // Handle each record. 
       try { 
        // One row. 
       } catch (SomeException se) { 
        // Deal with exception when processing the row so we do not abort the whole query. 
       } 
      } 
     } catch (SQLException se) { 
      // Perhaps database connection went down during the iteration. 
     } finally { 
      // Remember to close - whatever happens. 
      rs.close(); 
     } 
    } catch (Exception ex) { 
     // Probably the query is malformed or something. 
     log.error("failed", ex); 
    }