2010-09-02 7 views
4

Comment utiliser les exceptions et la gestion des exceptions pour que mon programme continue même si une exception se produit lors du traitement de certains fichiers dans un ensemble de fichiers?Gestion des exceptions Java

Je veux que mon programme fonctionne correctement pour les fichiers corrects, alors que pour les fichiers qui provoquent une exception dans le programme, il doit être ignoré.

Cordialement,

magggi

+0

Merci beaucoup pour vos réponses. – Magggi

Répondre

14
for(File f : files){ 
    try { 
     process(f); // may throw various exceptions 
    } catch (Exception e) { 
     logger.error(e.getMessage(), e); 
    } 
} 
+1

+1 pour le message de journal significatif (y compris le nom de fichier). La plupart du code que je vois a juste 'logger.info (e.getMessage())'. – Thilo

+1

Il est peut-être préférable de ne pas capturer le type d'exception général, mais plutôt les types d'exception spécifiques (IOException, ...). – boutta

+2

Bien qu'en pratique, si vous ouvrez une connexion au fichier, vous voulez ajouter un bloc finally dans lequel fermer la connexion selon la réponse de Colins. – Joel

11

Vous devez utiliser les try/catch/finally blocs.

try{ 
    //Sensitive code 
} catch(ExceptionType e){ 
    //Handle exceptions of type ExceptionType or its subclasses 
} finally { 
    //Code ALWAYS executed 
} 
  • try vous permettra d'exécuter du code sensible qui pourrait lancer une exception.
  • catch gérera une exception particulière (ou tout sous-type de cette exception).
  • finally aidera à exécuter des instructions même si une exception est levée et non interceptée.

Dans votre cas

for(File f : getFiles()){ 
    //You might want to open a file and read it 
    InputStream fis; 
    //You might want to write into a file 
    OutputStream fos; 
    try{ 
     handleFile(f); 
     fis = new FileInputStream(f); 
     fos = new FileOutputStream(f); 
    } catch(IOException e){ 
     //Handle exceptions due to bad IO 
    } finally { 
     //In fact you should do a try/catch for each close operation. 
     //It was just too verbose to be put here. 
     try{ 
      //If you handle streams, don't forget to close them. 
      fis.close(); 
      fos.close(); 
     }catch(IOException e){ 
      //Handle the fact that close didn't work well. 
     } 
    } 
} 

Ressources:

+0

J'en suis conscient. Problème: 1. Ma demande traite plusieurs fichiers. 2.Tous les fichiers peuvent échouer lors du traitement. (Exception) 3.Maintenant, mon application se ferme quand un fichier échoue. 4.Je veux que mon application continue à exécuter d'autres fichiers. Alors, comment dois-je structurer ma gestion des exceptions? – Magggi

+2

Vous devriez mettre toute votre gestion des exceptions dans votre boucle. –

0

juste attraper l'excpetion qu'il peut jeter et ne rien faire avec; mange comme les gens disent :) Mais au moins connectez-vous!

exemple très concise:

try { 
    your code... 
} catch (Exception e) { 
    log here 
} 
2

Je suppose que votre nouveau à la programmation comme execeptions sont un concept assez fundermental, car les problèmes peuvent se produire hors de votre contrôle et vous devez faire face.

Le principe de base est un bloc try catch.

try 
{ 
    //Your code here that causes problems 
} 
catch(exception ex) 
{ 
    //Your code to handle the exception 
} 

Vous 'essayez' votre code, et si une exception est déclenchée, vous 'l'attrapez'. Et fais ce dont tu as besoin. Il y a aussi un ajout au bloc catch en ce que vous pouvez ajouter finalement {} en dessous. Fondamentalement, même si aucune exception n'est levée, le code final est toujours exécuté. Vous pouvez vous demander le point dans ce cas, mais il est souvent utilisé avec les flux/gestion de fichiers etc pour fermer le flux.

En savoir plus sur les exceptions java ici des tutoriels écrits par Sun (maintenant Oracle) - http://download.oracle.com/javase/tutorial/essential/exceptions/

try 
{ 
    //Your code here that causes problems 
} 
catch(exception ex) 
{ 
    //Your code to handle the exception 
} 
finally 
{ 
    //Always do this, i.e. try to read a file, catch any errors, always close the file 
} 

La question que vous pouvez poser est comment voulez-vous attraper différentes exceptions, par exemple est une référence nulle, est-il diviser par zéro, n'est-ce pas un fichier trouvé ou un fichier non accessible en écriture, etc.Pour cela, vous écrivez plusieurs blocs catch différents sous l'essai, essentiellement une capture pour chaque type d'exception, l'utilisation de "exception" est essentiellement une déclaration catch tout, et comme dans la pile de if si une "exception" est la première capture bloquer, il va tout attraper, donc si vous avez plusieurs blocs catch, assurez-vous que l'exception est la dernière.

Encore une fois, ceci est un sujet utile mais volumineux, vous devez donc en prendre connaissance.

Puisque vous faites plusieurs fichiers, vous devez faire une boucle et le bloc try/catch se trouve dans la boucle.

Ainsi, même si un fichier tombe en panne, vous l'attrapez, mais continuez à tourner, le code circulera ensuite sur le fichier suivant sans encombre.

0

Typiquement, je l'aurais fait.

ArrayList<Entry> allEntries = getAllEntries(); 

for(Entry eachEntry:allEntries){ 
    try{ 
    //do all your processing for eachEntry 
    } catch(Exception e{ 
    ignoredEntries.add(eachEntry); 
    //if concerned, you can store even the specific problem. 
    } finally{ 
    //In case of resource release 
    } 
} 

if(ignoredEntries.size() > 0){ 
    //Handle this scenario, may be display the error to the user 
} 
0

FileSystemException peut être l'exception spécifique que vous recherchez.

Bien, une meilleure idée pour les débutants est d'attraper une exception et l'imprimer en utilisant

System.out.println(e);

e est l'exception pris.