web-dev-qa-db-fra.com

Comment puis-je détecter toutes les exceptions générées par la lecture et l'écriture d'un fichier?

En Java, existe-t-il un moyen d'obtenir (capture) tout exceptions au lieu d'attraper l'exception individuellement?

93
Johanna

Si vous le souhaitez, vous pouvez ajouter des clauses de projection à vos méthodes. Ensuite, vous n'avez pas à attraper les méthodes vérifiées tout de suite. De cette façon, vous pourrez attraper la exceptions plus tard (peut-être en même temps que d'autres exceptions).

Le code ressemble à:

public void someMethode() throws SomeCheckedException {

    //  code

}

Ensuite, vous pourrez utiliser la exceptions si vous ne voulez pas les traiter de cette manière.

Vous pouvez faire pour bloquer toutes les exceptions que certains blocs de code peuvent générer: (Ceci interceptera également Exceptions que vous avez écrit vous-même)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

La raison pour laquelle cela fonctionne est que Exception est la classe de base pour toutes les exceptions. Ainsi, toute exception pouvant être levée est un Exception ('E' majuscule).

Si vous voulez d'abord gérer vos propres exceptions, ajoutez simplement un bloc catch avant l'exception générique.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}
105
jjnguy

Bien que je convienne que capter une exception brute n’est pas un bon style, il existe des moyens de gérer les exceptions qui permettent une journalisation supérieure et la capacité de gérer les imprévus. Étant donné que vous êtes dans un état exceptionnel, vous êtes probablement plus intéressé par une bonne information que par le temps de réponse. Par conséquent, la performance des instances ne devrait pas être un gros succès.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Toutefois, cela ne prend pas en compte le fait que IO peut également générer des erreurs. Les erreurs ne sont pas des exceptions. Les erreurs appartiennent à une hiérarchie d'héritage différente de celle de Exceptions, bien que les deux partagent la classe de base Throwable. . Depuis IO peut jeter des erreurs, vous voudrez peut-être aller aussi loin que d'attraper Throwable

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}
90
codethulhu

Catch l'exception de base 'Exception'

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }
14
Allan

C'est une mauvaise pratique d'attraper Exception - c'est trop large, et vous risquez de rater quelque chose comme une NullPointerException dans votre propre code.

Pour la plupart des opérations sur les fichiers, IOException est l'exception racine. Mieux vaut attraper ça, à la place.

5
Alex Feinman

Oui il y a.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}
4
CodeFusionMobile

Vous pouvez intercepter plusieurs exceptions dans un seul bloc catch.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 
3
Rathishkumar Nair

Voulez-vous dire attraper un Exception de n'importe quel type qui est lancé, par opposition à quelques exceptions spécifiques?

Si c'est le cas:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}
2
JoshJordan