用自定义消息替换Java抛出异常并继续
我的Java用自定义消息替换Java抛出异常并继续,java,exception,try-catch,throw,Java,Exception,Try Catch,Throw,我的Javafor循环在ids()字符串[]数组中检查不同的id,如下所示: BackTest.java ..... for (String id: ids()) { //..do something addResult(result(id)); } ...... if (status != 200) { String error = "No additional error message
for循环
在ids()字符串[]数组中检查不同的id
,如下所示:
BackTest.java
.....
for (String id: ids()) {
//..do something
addResult(result(id));
}
......
if (status != 200) {
String error = "No additional error message received";
if (result != null && result instanceof JSONObject) {
JSONObject obj = (JSONObject) result;
if (obj.containsKey("error")) {
error = '"' + (String) obj.get("error") + '"';
}
}
throw new ApiException(
"API returned HTTP " + status +
"(" + error + ")"
);
}
其中,addResult()
将结果添加到一些Javamap
。如果id不存在
,即http状态=200
然后我抛出一个新异常,如以下代码段所示:
Api.Java
.....
for (String id: ids()) {
//..do something
addResult(result(id));
}
......
if (status != 200) {
String error = "No additional error message received";
if (result != null && result instanceof JSONObject) {
JSONObject obj = (JSONObject) result;
if (obj.containsKey("error")) {
error = '"' + (String) obj.get("error") + '"';
}
}
throw new ApiException(
"API returned HTTP " + status +
"(" + error + ")"
);
}
现在在我的第一个for
循环中,如果循环中的第一个id不存在
,那么我将抛出一个异常,这使得我的整个过程失败
,并且它无法检查作为id数组一部分的其他id。如何确保即使在数组中的第一个id上失败,代码也应该继续检查其他id
我可以考虑用try-catch块替换抛出新异常。举个例子就好了。您可以像这样处理异常
for(String id : ids()) {
try {
addResult(result(id));
} catch(ApiException e) {
System.err.println("Oops, something went wrong for ID "+id+"! Here's the stack trace:");
e.printStackTrace();
}
}
这将捕获异常,从而阻止其传播超过此点,从而结束循环,并将打印消息和堆栈跟踪。您可以这样处理异常
for(String id : ids()) {
try {
addResult(result(id));
} catch(ApiException e) {
System.err.println("Oops, something went wrong for ID "+id+"! Here's the stack trace:");
e.printStackTrace();
}
}
这将捕获异常,从而阻止其传播超过此点,从而结束循环,并将打印一条消息和堆栈跟踪。如果要继续处理列表/数组的其余部分而不引发新异常的开销,然后我将研究如何使用continue
关键字
continue
关键字是为这种情况设计的。它使程序的执行立即返回到最近循环的开始,并测试其条件。我建议使用以下设置
for(String id : ids()) {
//do stuff...
if(status != 200) {
//write to data logger, etc...
continue;
}
addResult(result(id));
}
有些人不喜欢使用continue
,因为太多的人会产生混乱的代码。但是,如果节省使用,它们可以帮助减少循环中的代码量。如果您想继续处理列表/数组的其余部分而不引发新异常的开销,那么我会考虑使用continue
关键字
continue
关键字是为这种情况设计的。它使程序的执行立即返回到最近循环的开始,并测试其条件。我建议使用以下设置
for(String id : ids()) {
//do stuff...
if(status != 200) {
//write to data logger, etc...
continue;
}
addResult(result(id));
}
有些人不喜欢使用continue
,因为太多的人会产生混乱的代码。但是,如果使用得当,它们可以帮助减少循环中的代码量。您可以捕获异常并使用try
/catch
处理它们。这就是你要问的吗?是的,你是对的。所以:试试{addResult(result(id));}catch(ApiException){e.printStackTrace();}
?不能回答我的问题。因此,addResult()方法对于循环中的第一个id失败,因此整个
循环没有得到执行。这是怎么失败的?当我执行addResult()时,它会将我带到Api.java
,并检查if(status!=200)
,如我的原始问题所示。然后我把它扔到那里。addResult()调用不在Api.java中。更新我的问题您可以捕获异常并使用try
/catch
处理它们。这就是你要问的吗?是的,你是对的。所以:试试{addResult(result(id));}catch(ApiException){e.printStackTrace();}
?不能回答我的问题。因此,addResult()方法对于循环中的第一个id失败,因此整个
循环没有得到执行。这是怎么失败的?当我执行addResult()时,它会将我带到Api.java
,并检查if(status!=200)
,如我的原始问题所示。然后我把它扔到那里。addResult()调用不在Api.java.com中。正在更新我的问题