2011-09-15 4 views
3

私はJavaでのリソースを取得する必要があり、その後、リソースが解放されることを保証するたびに、例外がスローされる可能性がある場合は、私は次のパターンを使用します。Javaがしようと、最終的には内側のtry-catchパターン

try { 
    Resource resource = null; 
    try { 
    resource = new Resource(); 
    // Use resource 
    } finally { 
    if (resource != null) { 
     // release resource 
    } 
    } 
} catch (Exception ex) { 
    // handle exceptions thrown by the resource usage or closing 
} 

を私は、データベース接続を必要とし、接続を使用するか、閉じると例外をスローすることができ、私は次のコード記述した場合たとえば、:

try { 
    Connection connection = null; 
    try { 
    connection = ... // Get database connection 
    // Use connection -- may throw exceptions 
    } finally { 
    if (connection != null) { 
     connection.close(); // This can also throw an exception 
    } 
    } 
} catch (SQLException ex) { 
    // handle exceptions thrown by the connection usage or closing 
} 

を私はちょうど私ので、簡単なのtry-catch-ついにやって好きではありませんデータベースがconneしたときにスローされる可能性のある例外をキャッチする義務があります私はそれをどう扱うかわからない。

この状況を処理するためのより良いパターンがありますか?

+0

通常の例外にfinally節を追加しないのはなぜですか(この場合はSqlException ..) –

+0

似ていますが正確なものはありません:http://stackoverflow.com/questions/1335812/try-catch-finally -and-then-again-a-try-catch – razlebe

+0

リソースを閉じる前にリソースがヌルであるかどうかチェックする必要があるのは好きではありません。私はむしろtryブロックの外にリソースを作成し、すべてを避けるでしょう。閉じている間にスローされた例外もかなり役に立たず、ただログに記録し続けます。 –

答えて

8

が個人的に、私は、次のパターンを使用します。このパターンは例外を失うことはありませんが、コードをもっときれいにします。このパターンは、finally節(この場合はclose())で捕捉された例外が扱いにくく、より高いレベルで処理される必要がある場合に使用します。

まだクリーナーはローンパターンを使用しています。

2

例外の処理方法がわからない場合は、例外をキャッチしないでください。

8

IOUtils.closeQuietly()で問題を解決できる場合があります。

例:

Connection connection = null; 
    try { 
    connection = ... // Get database connection 
    // Use connection -- may throw exceptions 
    } finally { 
    close(connection); 
    } 

private void close(Connection connection) { 
    try { 
    if (connection != null) { 
     connection.close(); // This can also throw an exception 
    } 
    } catch (Exception e) { 
    // log something 
    throw new RuntimeException(e); // or an application specific runtimeexception 
    } 
} 

又はそれに類似する:

Closeable closeable = null; 
    try { 
     closeable = new BufferedReader(new FileReader("test.xml")); 
     closeable.close(); 
    } catch (IOException e) { 
     // Log the exception 
     System.err.println("I/O error"); 
    } finally { 
     // Don't care about exceptions here 
     IOUtils.closeQuietly(closeable); 
    } 
+1

'closeable.close()'のポイントは、既に 'IOUtils.closeQuietly(closeable);'で閉じている場合は表示されません。また、これは例外を飲み込んでいます。たぶん、それを伝播させて、より高いレベルで処理する方が良いでしょう。さて、もしあなたがそれをどうしたらいいのか分からなければ、何をすべきかについて明確に2つの選択肢があります。嚥下または伝播:) –

+0

私の以前の例では、例外を飲み込んでいました。これは、ロギングと嚥下です。ずっといい :)。ありがとう@ Xavi。 –

+0

ハハ、そうです:)私に 'closeQuietly()'を見せてくれてありがとう! –

関連する問題