5

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 と同じ規則を使用します。

4

5 に答える 5

14

フラグ変数を設定し、finally 句で次のように確認します。

boolean exceptionThrown = true;
try {
   mightThrowAnException();
   exceptionThrown = false;
} finally {
   if (exceptionThrown) {
      // Whatever you want to do
   }
}
于 2008-09-15T20:38:26.153 に答える
10

これを行っていることに気付いた場合は、設計に問題がある可能性があります。「finally」ブロックの考え方は、メソッドの終了方法に関係なく、何かを実行したいということです。finally ブロックはまったく必要なく、try-catch ブロックのみを使用する必要があるように思えます。

try {
   doSomethingDangerous(); // can throw exception
   onSuccess();
} catch (Exception ex) {
   onFailure();
}
于 2008-09-15T20:42:55.393 に答える
1

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

try {
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { //or catch whatever you want here
        // exception handling code, or just ignore it
    }
}
于 2008-09-15T20:34:58.983 に答える
0

try ブロックが正常に完了したかどうかに応じて、finally ブロックの動作を変えたいということですか?

もしそうなら、あなたはいつでも次のようなことをすることができます:

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

しかし、それはかなり複雑になってきています...これを不要にするためにコードを再構築する方法を考えたいと思うかもしれません。

于 2008-09-15T20:38:46.823 に答える
-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
}

それ以外の場合は、例外コードが使用するsynchronize()オブジェクトを追加して、finallyブロックをチェックインできます。これは、別のスレッドで例外を実行しているかどうかを識別するのに役立ちます。

于 2008-09-15T20:34:05.290 に答える