12

プログラム内で例外をスローした後も実行フローを続行する必要があるという要件があります。

for(DataSource source : dataSources) {
    try {
        //do something with 'source'
    } catch (Exception e) {
    }
}

最初の反復で例外がスローされた場合、フローの実行は停止されます。私の要件は、最初の反復で例外をスローした後でも、他の反復を続行する必要があることです。キャッチブロックにロジックを書くことはできますか?

4

5 に答える 5

19

さて、まず第一に、

例外には 2 種類あります。チェックあり&チェックなし。

非チェック例外は、プログラムが回復できない例外です。NullPointers のように、ロジックに何か問題があることを伝えます。

チェックされた例外は実行時例外であり、これらの例外から回復できます。

したがって、「Exception」基本クラスを探す catch ステートメントの使用は避ける必要があります。これは両方の時間を表しています。おそらく、特定の例外 (通常はランタイム例外のサブクラス) を探すことを検討する必要があります。

要するに、それだけではありません。

また、例外処理をワークフローとして使用しないでください。通常、アーキテクチャに何らかの欠陥があることを示しています。名前が示すように、それらは通常の実行に対する「例外」として扱われるべきです。

今、あなたのコードを考えると:

for(DataSource source : dataSources) {
    try {
        //do something with 'source'
    } catch (Exception e) { // catch any exception
      continue; // will just skip this iteration and jump to the next
    }
   //other stuff ? 
}

そのまま、例外をキャッチして先に進む必要があります。多分あなたが私たちに言っていないことがありますか?:P

とにかく、これが役立つことを願っています。

于 2012-05-02T11:55:13.940 に答える
12

catch ブロック内で何らかの形でループを中断していない場合は、前の反復で例外がスローされたかどうかに関係なく、他の反復が続行されます。

この簡単な例を試して、何が起こるか見てみましょう:

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");

for(String str: list) {
   try {
       System.out.println(str);
       throw new Exception("Exception for string " + str);
   } catch(Exception ex) {
       System.out.println("Caught exception");
   }
}

それぞれが例外をスローしても、すべての反復が実行されることがわかります。

于 2012-05-02T11:43:03.293 に答える
2

for(DataSource source : dataSources)while 呼び出しdataSourcesで反復子を初期化するために例外が発生した場合、その例外はキャッチされません。

「最初の反復で例外がスローされた場合、フローの実行は停止します。 」という意味ですか?

この場合、他にできることはなく、ループは反復を実行しないでください。

于 2012-05-02T19:55:43.197 に答える
1

そこにあるロジックはまさに​​それを行います。例外がDataSource無効な状態になった場合、次にイテレータを使用しようとすると別の例外がスローされる可能性がありますが、それは別の問題であり、固有のものDataSourceです (そのためDataSource、他の処理に対処できるかどうかを確認する必要があります)。何らかの方法で無効な状態)。しかし、一般的なケースでは、あなたはそれを正しくやっています。

于 2012-05-02T11:44:24.557 に答える
-1

いいえ、例外を処理し、それを引き起こしたステートメントに戻るための言語サポートはありません。try...catch前のサブシーケンスが例外をスローした場合でも、実行する操作のすべてのサブシーケンスを個別の構造でラップする必要があります。

于 2012-05-02T11:43:01.920 に答える