2011-12-13 88 views
0

我想执行一堆抛出异常的命令,但是我遇到了程序正常执行的问题。Java尝试抛出问题

这是我的代码的基本轮廓:

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

如果命令1抛出一个异常,如何让我的程序移动到command2的?换句话说,我该如何回到try-block并继续执行它从哪里离开?谢谢。

+0

命令是否依赖于它们之前成功的命令?如果它们可以彼此独立运行,你可以将它们全部分成单独的`try`-`catch`块。 – birryree 2011-12-13 23:13:14

+0

是的,甚至更好,将调用和错误处理放到一个函数中。例如`executeAllCommands`调用`executeCommand1`和`executeCommand2`,每个`try {commandN()} catch ... {}` – 2011-12-13 23:23:58

回答

8

一旦你在catch块中,你永远不会回到try块。你必须让三个块继续执行。

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块。

连续的try/catch没有问题,除非你真的需要command2来发生 - 无论如何 - 即使command1的异常处理失败。

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... 
} 

您还可以使用命令行界面可很容易地添加更多命令如果需要。

相关问题