2010-10-19 3 views
1

Les codes:continuer ma demande quand il eu une 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. 
    } 
} 

Dans les codes ci-dessus, le LogParser utilisé pour analyser le journal tomcat de motif combiné, lorsque obtenir les données de format de date, j'utilise le SimpleDateFormat pour analyser à un objet Java.Util.Date, alors il peut lancer une exception ParseException.the logs ici est juste utilisé pour lancer l'exception.

Toutefois, lorsque cette exception se produit lors de l'analyse d'un journal, l'application quitte, je veux qu'il contine le journal suivant.

Comment le fabriquer?

J'ai lu le tutoriel à:

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

Il a dit que Error et RuntimeException ne sont pas soumis au bloc try catch, l'application quittera quand même.

Mais le java.text.ParseException étend l'exception, pourquoi il ne peut pas être soumis à mon bloc try-catch? Depuis la « erreur » la variable ne soit +1,

J'ai pensé utiliser ceci:

oui, cela fonctionne, mais quand le journal est analysé correctement, l'erreur serait également ajouter, CA ne devrait pas être.

Quelqu'un peut-il me dire pourquoi?

+0

Etes-vous sûr que c'est une ParseException que vous obtenez? Il devrait y avoir stacktrace incluant le nom de la classe d'exception lorsque votre application se termine. – Thilo

+0

Quel serveur LogParser utilisez-vous? vérifiez sa documentation ou la source si vous avez accès pour voir si elle se termine avec System.exit() sur exception. –

Répondre

5

Vous attrapez ParseException, mais un autre type d'exception est probablement lancé. Essayez de remplacer cela par (Exception e) et de voir quel type vous lancez. Vous pouvez ensuite réduire la portée de la capture au type d'exception approprié.

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

ou attraper Throwable à la place à des fins de débogage ... – pstanton

+0

mais uniquement à des fins de débogage! ne jamais attraper Throwable elsewise; vous pourriez obtenir quelques bugs méchants sur la route si vous le faites – naiad

+0

C'est vrai. Après avoir déterminé le problème, vous devez réduire la portée au type approprié comme je l'ai mentionné. – Alex

3

Alex a raison. Le programme lance un type différent d'exception et non le ParseException que vous essayez d'attraper. Cependant, au lieu d'attraper Exception e, vous pouvez essayer d'attraper plusieurs exceptions en commençant par le plus spécifique. Par exemple:

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

Vous pouvez avoir autant de déclarations de captures que vous voulez, mais rappelez-vous que le premier correspondant sera utilisé afin de ne pas mettre catch(Exception e) en premier.

Questions connexes