我有一个try
- catch
阻止我希望break
像switch
阻止但我找不到推荐的方法。我在try
- catch
块中获取了大量数据,并希望在满足某个条件的情况下停止提取。为了让它现在正常工作,我故意强迫代码进入catch
块:
int i=0;
try {
//--do stuff----
if(//-------is condition met?--------//)
i = 1/0; // divide 1 by 0 -- a definite exception
}
catch (Exception e) {//---------do nothing---------//}
这样做是否安全,还是我应该采取其他方式?
编辑:我正在获取一些xml数据(实际上,很多)。根据互联网连接,我需要在某个时间(超时)之后停止解析,而不是通过整个流。我经历了循环,但我稍后也做了一些计算。用不完整的数据计算没有任何意义,所以我宁愿跳过整个事情。
答案 0 :(得分:10)
这段代码闻起来有些反模式,但没有更多的背景,我们就无法规定更好的设计。通常,您应该只为程序状态中的真正异常条件抛出异常。您应该特别不为正常(预期)控制流抛出异常,而应使用控制流语句,例如循环(使用break
/ continue
)和{{1 }}
如果您确实希望保留此结构(即使您不应该这样),那么我建议明确地抛出一个特殊的异常类,以明确您正在做的事情,例如:
return
但同样,你可能最好还是重构使用循环和内置的public static class ConditionMetException extends Exception { }
// ...
try {
// do stuff
if ( /* Is condition met? */ ) {
throw new ConditionMetException();
}
} catch (ConditionMetException cme) { /* Do nothing. */ }
命令。
答案 1 :(得分:3)
break
或throw
会做你想做的事情(而throw
会更好,你至少可以追溯到你正在做的事情。
[编辑]
what: try {
System.out.println ("before break");
break what;
} catch (Exception e) {}
}
[/编辑]
答案 2 :(得分:1)
抛出异常只是为了打破是不好的做法。
这适用于您的情况吗?
所以你的最终代码就像是
int recordsRead = -1; // -1 means failure
try {
recordsRead = fetchLotsOfData();
}
catch (IOException ioe) {
// handle the exception
}
// process what you got...
答案 3 :(得分:1)
你不应该担心突破问题。从我所知道的,你正在寻求做的事情:
try
{
// do thing 1
// do thing 2
if (!done)
{
// do thing 3
// do thing 4
if (still not done)
{
// do thing 5
}
}
} catch (Exception e)
{
}
如果这是你想要做的,那么你可能应该这样做(而不是试图逃离try-catch)。另一种方法是缩小try-catch块以单独包围每个任务。
如果您为问题提供更多背景信息,则可以提供更好的答案。
答案 4 :(得分:1)
我要回答“这是一个好主意吗?”问题的一部分:不。
使用异常来实现预期的控制流不是一个好主意。这是可能的,但不是预期的,因为它可以使所有变量成为字符串并在数组中实现所有数据结构。
Try-blocks用于创建范围边界,在终止时具有某些保证(catch
和finally
行为)。代码维护者看到:
try{ ... }catch(Exception x){}
非常强烈倾向于重新抛出x
(可能包裹)或完全消除该块。
尝试块不是关于 范围内的内容。这就是标准循环结构,更好的是函数。如果你将范围放在函数中,你的问题就会消失:
RetVal doStuff(Arg arg){
//--do stuff----
if(//-------is condition met?--------//)
return myResult;
}
答案 5 :(得分:0)
将其余的提取放入具有反向条件的if块中:
//--do stuff----
if (!shouldStop) {
// continue doing stuff
}
答案 6 :(得分:0)
按照您的代码查看
int i=0;
try {
//--do stuff----
if(//-------is condition met?--------//)
i = 1/0; // divide 1 by 0 -- a definite exception
}
catch (Exception e) {//---------do nothing---------//}
如果不满足条件?那你就不用担心使用break了,
如果满足条件,肯定会有异常,并且在catch中处理(尽管你没有做任何事情)
答案 7 :(得分:0)
如果没有其他方法可以使用块标签
load:{
if(test)//skip the remaining load block
break load;
}
否则,您可以将加载代码重构为不同的方法并尽早返回。
答案 8 :(得分:0)
不要将异常用于非异常错误处理。这可能是一个命名的反模式。如果是这样,我不知道这个名字。
以下是抛出异常并且不使用异常处理来执行非异常错误处理时抛出循环的示例:
try
{
while (... whatever ...)
{
... do something that might throw a BlammoException.
}
}
catch (BlammoException exception)
{
... handle the exception.
}
答案 9 :(得分:0)
只要扔掉你想要抓住的任何例外......
boolean stopLoop = false;
while (!stopLoop) {
try {
int key = Integer.parseInt(userInput);
if (key > cutOff) throw new NumberFormatException();//<--like this
else {
System.out.println("Good job, your number didn't suck");
//do some stuff...
stopLoop = true;//<--End loop after some stuff
//some more stuff, or..
if(nomorestuff)break;//<--exit loop
}
catch (NumberFormatException nfe){
System.err.println("Enter a number less than "+cutOff);
}
}//end while