2012-05-02 13 views
7

私は例外を投げた後でもプログラムの実行フローを継続する必要があります。例外をスローした後でもプログラムの実行を続行するには?

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

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

+2

ここにあなたが持っているロジックはまさに​​それをします。例外が 'DataSource'を無効な状態にすると、イテレータを使用しようとする次の試みは異なる例外をスローする可能性があります。 –

答えて

-3

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

+1

* "いいえ、例外を処理し、それを引き起こしたステートメントに戻ることはできません"という言葉のサポートはありません。何が求められたかは、他の***の繰り返しを続ける方法を尋ねたものです。 –

+0

^本当です。彼が望むものは、「キャッチ」の後に「最後に」を追加し、反復がクラッシュしたところから繰り返していくようなものです。これは回避策かもしれませんが、それはお勧めできず、かなり醜いです。 –

6

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"); 
    } 
} 

あなたは、それぞれ1つが例外をスローしたにも関わらず、全ての反復が実行されることが表示されます。

+0

こんにちはチューダー、お返事ありがとうございます。わかった。私はまたすべての反復の後に呼び出されるブロックを最終的に配置する必要があります。繰り返しのたびに呼び出されるべきではありません。どうすればそれを達成できますか?私を助けてください! – user1016403

+0

@ user1016403:その場合、 'try {for} {code}} finally {}'のように 'for try ... finally'ブロックのforループ全体をラップする必要があります。 – Tudor

0

あなたが今そこに持っているロジックは、まさにそれを行います。例外によってDataSourceが無効な状態になると、次のイテレータの使用で別の例外がスローされることがありますが、それはDataSourceとはまったく異なる問題です(DataSourceは対処することができるかどうかを調べる必要があります)何らかの形でその他の無効な状態で)。しかし、一般的なケースでは、あなたは正しいことをしています。

9

まずはじめに、

例外の種類は2種類あります。チェックされた&チェックされていません。

チェックされていない例外は、プログラムが回復できない例外です。 NullPointersのように、あなたのロジックに何かが本当に間違っていることを伝えます。

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

したがって、「例外」基本クラスを探すcatch statemensは使用しないでください。両方の時間を表す。特定の例外(通常はランタイム例外のサブクラス)を探すことを検討するべきでしょう。

要するに、これ以上のことがあります。

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

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

とにかく、これが役立ちます。

1

例外がキャッチされないということ、その後、イテレータを初期化するためにdataSourcesを呼び出し中に例外がfor(DataSource source : dataSources)で発生した場合。 最初の反復で例外がスローされた場合、フローの実行は停止します。 "?

この場合、ループは実行できません。ループはではありません。は任意のインターラクションを実行します。

関連する問題