2008-09-15 8 views
4

finally節内から例外がスローされていることを検出する方法はありますか?Javaでのfinally finally節の失敗

すなわち:


try { 
    // code that may or may not throw an exception 
} finally { 
    SomeCleanupFunctionThatThrows(); 
    // if currently executing an exception, exit the program, 
    // otherwise just let the exception thrown by the function 
    // above propagate 
} 

や例外の1あなたができる唯一のことを無視しています。 C++では、例外の1つを無視してterminate()を呼び出すことさえできません。他のほとんどの言語はjavaと同じ規則を使用します。

答えて

13

、その後、finally節でそれをチェックしますtryブロックは正常に完了しましたか?

もしそうなら、あなたはいつものような何かを行うことができます:かなり複雑になっています

boolean exceptionThrown = false; 
try { 
    // ... 
} catch(Throwable t) { 
    exceptionThrown = true; 
    // ... 
} finally { 
    try { 
     SomeCleanupFunctionThatThrows(); 
    } catch(Throwable t) { 
     if(exceptionThrown) ... 
    } 
} 

を、しかし...あなたは、この不要をやって作るためにあなたのコードを再構築するための方法を考えたいかもしれません。

+0

あなたはあまりにも速いです...あなたは私の答えをすくった – martinatime

-1

いいえ私はそう信じていません。 catchブロックは、finallyブロックの前に完了まで実行されます。

try { 
    // code that may or may not throw an exception 
} catch { 
// catch block must exist. 
finally { 
    SomeCleanupFunctionThatThrows(); 
// this portion is ran after catch block finishes 
} 

そうでない場合は、あなたが(同期を追加することができます)別々のスレッドで使用すると、例外を実行している場合、あなたが識別しやすくなりますが、finallyブロックでチェックできるという例外コードが使用するオブジェクト、。

+0

これは間違っていますが、キャッチブロックを持つ必要は全くありません。私はあなたにはまったくブロックが必要ないように思えます。 – shsteimer

1

関数がスローして例外をキャッチしたい場合は、関数をtryブロックにラップする必要があります。これは最も安全な方法です。

boolean exceptionThrown = true; 
try { 
    mightThrowAnException(); 
    exceptionThrown = false; 
} finally { 
    if (exceptionThrown) { 
     // Whatever you want to do 
    } 
} 
0

あなたが最終的にかどうかに応じて異なる動作をするためにブロックしたいわけでください:だからあなたの例では:これは次のように

フラグ変数を設定し
try { 
    // ... 
} finally { 
    try { 
     SomeCleanupFunctionThatThrows(); 
    } catch(Throwable t) { //or catch whatever you want here 
     // exception handling code, or just ignore it 
    } 
} 
10

これを実行すると、デザインに問題が発生する可能性があります。 「最終的に」ブロックという考えは、メソッドがどのように終了するかに関係なく、何かをしたいということです。

関連する問題