2010-10-19 2 views
1

Коды:продолжить свое применение при возникновении на исключение из

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.the, который используется только для исключения исключения.

Однако, когда это исключение, когда выполняется синтаксический анализ одного журнала, приложение завершит работу, я хочу, чтобы он был следующим журналом.

Как это сделать?

Я прочитал учебник по адресу:

http://download.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html.

Сообщалось, что ошибка и исключение RuntimeException не относятся к блоку захвата try, приложение все равно выйдет.

Но java.text.ParseException расширяет исключение, почему он не может быть объектом моего блока try-catch? Поскольку переменная «ошибка» не будет +1,

Я думал использовать это:

да, это работает, но когда журнал разобран правильно, то ошибка будет также добавить, так не должно быть.

Может ли кто-нибудь сказать мне, почему?

+0

Вы уверены, что это ParseException, которое вы получаете? Там должно быть stacktrace, включая имя класса исключения, когда ваше приложение выходит. – Thilo

+0

Какой LogParser вы используете? проверьте его документацию или источник, если у вас есть доступ, чтобы узнать, выходит ли он с помощью System.exit() для исключения. –

ответ

5

Вы ловите ParseException, но, вероятно, другой тип исключения будет выброшен. Попробуйте заменить это на (Exception e) и посмотрите, какой тип вы бросаете. Затем вы можете уменьшить область улова до соответствующего типа исключения.

String[] logs={"a","b","c"}; 
int errors=0; 
for(String str:logs){ 
    try{ 
    LogParser.parse(str); 
    } catch(Exception e){ // <-- try this 
    error++; 
    continue; 
    } 
} 
+0

или catch Throwable вместо этого для целей отладки ... – pstanton

+0

, но только для отладки! никогда не поймайте Throwable elsewise; вы можете получить некоторые неприятные ошибки по дороге, если вы делаете – naiad

+0

. Верно. После выяснения проблемы вам нужно сузить область действия до соответствующего типа, как я уже упоминал. – Alex

3

Alex является правильным. Программа выбрасывает другой тип исключения, а не 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(Exception e) первым.

Смежные вопросы