发生异常时继续我的申请

时间:2010-10-19 01:38:42

标签: java exception

代码:

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

是的,它可以工作,但是当正确解析日志时,错误也会被添加,它不应该是。

任何人都可以告诉我原因吗?

2 个答案:

答案 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)