2011-02-20 26 views
1

このメソッドではなく、より高いレベルで例外を処理したいが、オブジェクト& bが正しく閉じられていることを確認したい。複数の例外スローアオブジェクトを正しく処理する方法

close()メソッドも例外をスローすることができます。

このテンプレートはこれに適したソリューションですか、よりスマートでシンプルなソリューションですか?

public void foo() throws Exception { 
A a = null; 
B b = null; 
try { 
    a = new A(); 
    b = new B(); 
    ... 
} catch(Exception e) { 
    throw e; 
} 
finally { 
    Exception ex = null; 
    try { 
    if (a != null) 
    a.close(); 
    } catch(Exception x){ 
    ex = x; 
    } 
    try { 
    if (b != null) 
    b.close(); 
    } catch(Exception x) { 
    ex = x; 
    } 
    if (ex != null) 
    throw ex; 
} 
+1

[c#]と[java]の両方にタグが付けられている理由は何ですか? – BoltClock

+0

閉じるメソッドのエラーチェックで何を得ていますか?なぜ彼らはそれ以上の扱いをされていないのですか? –

答えて

1
A a = null; 
try 
{ 
    a = new A(); 
    //do stuff 
} 
finally 
{ 
    a.Close(); 
} 

tryブロックcatchブロックを必要としない、それはcatchまたはfinallyブロック(または両方)を必要とします。

using(A a = new A()) 
using(B b = new B()) 
{ 
    //... 
} 

これはab両方が制御ブロックを離れるDispose Dであることを保証:

1

(C#で)この問題に対する正しい解決策はusingステートメントです。

1

小さな問題が1つあります。a.close()b.close()の両方が失敗した場合は、exを再利用するため、a.close()の例外が失われます。

ロガーを使用して例外メッセージを永続化することができます。この場合、エラーメッセージをログファイルに保存したため、のfinallyブロック内の例外をスローするだけで十分です。

1
  1. Femarefが言うことのほかに、1つまたは複数の閉鎖可能なものを撮影し、必要に応じて例外をスローするヘルパーメソッドを作成することができます。冗長性を減らすだけです。

  2. close呼び出し中に発生したエラーメッセージではなく、元のエラーメッセージを返すことが一般的には望ましいです。後者はおそらく前者から直接続くでしょうが、あなたは前者が問題の本当の原因に到達する必要があります。

関連する問題