2011-12-13 10 views
0

例外をスローするコマンドを実行したいが、プログラムの実行に問題がある。Javaのtry-throw-catchの問題

これは私のコードの基本的なアウトラインです:Command1をが例外をスローした場合

try 
{ 
    command1 //all three throw exceptions 
    command2 
    command3 
} 
catch (Exception e) 
{ 
    //log the exception in a txt file and continue onto the next command 
} 

、どのように私は私のプログラムはcommand2の上に移動するのですか?言い換えれば、try-blockに戻り、中断したところから実行を継続するにはどうすればよいですか?ありがとう。

+0

コマンドは前のコマンドの成功に依存していますか?お互いに独立して動くことができるならば、それらをすべて別々の 'try'-' catch'ブロックに分割することができます。 – birryree

+0

はい、さらに良いことに、呼び出しとエラー処理を1つの関数に入れます。例えば'executeAllCommands'は各' try {commandN()} catch ... {} 'の 'executeCommand1'と' executeCommand2'を呼び出します。 –

答えて

8

catchブロックに入ってからtryブロックに戻ることはできません。実行を続行するには、3つのブロックを作成する必要があります。

try { command1(); } 
catch (Exception e) { log(e); } 
try { command2(); } 
catch (Exception e) { log(e); } 
try { command3(); } 
catch (Exception e) { log(e); } 
2

それぞれのコマンドを独自のtry/catchで実行する必要があります。 例外がスローされると、catchに行き、最初のコマンドの後に通常の実行に戻ることはできません。

try{ 
    command1 
}catch(Exception e){} 

try{ 
    command2 
}catch(Exception e){} 

try{ 
    command3 
}catch(Exception e){} 
2

try-catchブロック内で個々のコマンドをラップすることによってのみ実行できます。あなたがしようとキャッチメソッド内の個々のコマンドをカプセル化し、例外ログのような種類の再設計を検討する必要がありますので、しかし

try { 
    command1; 
} 
catch(Exception e) { 
// log this 
} 
try { 
    command2; 
}catch(Exception e){ 
// log that 
} 

厥かなり醜いです。

3

これは宿題なので、ブロックfinallyについても知っているはずです。

command1からの例外に対する処理が失敗したとしても、実際にcommand2を実行する必要がない限り、try/catchは正常です。

try { 
    command1(); 
} catch (Exception e) { 
    command1Failed(e); 
} finally { 
    try { 
     command2(); 
    } catch (Exception e) { 
     command2failed(e); 
    } 
} 

これはあなたにとって重要であるかどうか、私は知りませんが、私はあなただけのためcommand2は別々のtry/catchブロックであることを知っていることが重要だと思う、それはまだそれが保証するものではありませんあなたのエラー処理の仕方に応じて実行します(例:ファイルアクセス権の書き込みに失敗した場合)

0

すべてのコマンドがメソッドであれば、それだけで例外をスローして、すべて異なるエラーメッセージでキャッチできます。

public class MyException extends Exception { 
    //overide constructor to set your error message 
} 

...コマンド

public void command() throws MyException { 
    try { //do some stuff 
    } catch(Exception e) { 
     throw new MyException("my message"); 
    } 
} 

を実装する...あなたはまた、より多くを追加することが簡単にするために、コマンド・インタフェースを使用することができ、あなたのすべてのコマンドの例外

try { 
    command1(); 
    command2(); 
} catch (MyException e) { 
    // e.getMessage() will return your error message you used in the throws declaration... 
} 

を扱います必要に応じてコマンドを実行します。

+0

これは質問に従ってcommand2に移動しません。これは単に例外を変換します。 –