代码:
String[] logs={"a","b","c"};
int errors=0;
for(String str:logs){
try{
LogParser.parse(str);
} catch(ParseException e){
error++;
continue; // Seems that, this two line codes are not reached.
}
}
在上面的代码中,LogParser用于解析组合模式的tomcat日志,当获取日期格式数据时,我使用SimpleDateFormat将其解析为Java.Util.Date对象,然后它可能抛出ParseException。这里的logs数组只用于抛出异常。
然而,当解析一个日志时出现此异常时,应用程序将退出,我希望它继续下一个日志。
如何制作?
我已阅读教程:
http://download.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html
它说Error和RuntimeException不是try catch块的子主题,应用程序仍会退出。
但java.text.ParseException扩展了Exception,为什么它不能受我的try-catch块约束? 由于“错误”变量不是+1,
我原以为是用这个:
finally{
error++;
continue;
}
是的,它可以工作,但是当正确解析日志时,错误也会被添加,它不应该是。
任何人都可以告诉我原因吗?
答案 0 :(得分:5)
您正在捕获ParseException
,但可能会抛出另一种异常类型。尝试用(Exception e)
替换它,看看你扔的是什么类型。然后,您可以将catch的范围缩小到适当的异常类型。
String[] logs={"a","b","c"};
int errors=0;
for(String str:logs){
try{
LogParser.parse(str);
} catch(Exception e){ // <-- try this
error++;
continue;
}
}
答案 1 :(得分:3)
亚历克斯是对的。该程序抛出了一种不同类型的异常,而不是你试图捕获的ParseException
。但是,您可以尝试捕获从最具体的开始的多个异常,而不是捕获Exception e
。例如:
String[] logs={"a","b","c"};
int errors=0;
for(String str:logs){
try{
LogParser.parse(str);
} catch(ParseException e){
error++;
continue;
}
catch(Exception e){
//Code to catch generic exception
}
}
你可以拥有任意数量的catch语句,但请记住第一个匹配的语句将被使用,所以不要先放置catch(Exception e)
。