Comment puis-je détecter toutes les exceptions qui seront levées lors de la lecture et de l'écriture d'un fichier?


105

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


2
et j'attraperai toutes ces exceptions spécifiques avec catch (Exception e) {} ??
Johanna

Ouais. Puisque Exception est la classe de base de toutes les exceptions, elle interceptera n'importe quelle exception.
jjnguy le

1
@ jjnguy: merci pour votre bonne explication.
Johanna

Je suis content que cela ait été utile.
jjnguy

Réponses:


111

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

Le code ressemble à ceci:

public void someMethode() throws SomeCheckedException {

    //  code

}

Ensuite, vous pourrez vous en occuper plus tard exceptionssi vous ne voulez pas les traiter de cette manière.

Pour attraper toutes les exceptions, un bloc de code peut lancer, vous pouvez le faire: (Cela détectera également que Exceptionsvous 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 Exceptionc'est la classe de base pour toutes les exceptions. Ainsi, toute exception qui peut être levée est un Exception(«E» majuscule).

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

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

95

Bien que je convienne que ce n'est pas un bon style d'attraper une exception brute, il existe des moyens de gérer les exceptions qui fournissent une journalisation supérieure et la capacité de gérer l'inattendu. Étant donné que vous êtes dans un état exceptionnel, vous êtes probablement plus intéressé par l'obtention de bonnes informations que par le temps de réponse, donc l'instance de performance ne devrait pas être un grand 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;
    }
}

Cependant, 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 sont sous une hiérarchie d'héritage différente de celle des exceptions, bien que les deux partagent la classe de base Throwable. Étant donné que IO peut lancer des erreurs, vous voudrez peut-être aller jusqu'à 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;
    }
}

12
Pourquoi ne pas utiliser plusieurs blocs catch?
Carl G

1
Je dirais que vous devriez attraper chaque exception explicitement, mais la question demandait explicitement comment attraper tout ce qu'un bloc de code lancerait.
codethulhu

Ce jetable était utile.
Anshul

C'est la solution que je recherchais, j'avais besoin d'un if else pour la gestion des exceptions. Merci
CubeJockey

La pointe jetable est vraiment utile.
cherryhitech

15

Attrapez l'exception de base «Exception»

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

8
Si vous écrivez ce code, vous faites certainement quelque chose de terriblement mal.
George

2
@George Pourquoi as-tu dit ça?
kuchi

10
@George Pas nécessairement, si vous traitez avec quelque chose qui a beaucoup de paramètres d'entrée sensibles et qu'il est très compliqué de vérifier la validité de chacun d'eux, attraper toutes sortes d'exceptions une fois que les cas de travail sont correctement testés est la voie à suivre . Cela rendra le code clair et beaucoup moins mental qu'une condition énorme et potentiellement lourde.
Johnride

2
La plupart des codeurs avec lesquels j'ai travaillé ne mettent rien dans leurs déclarations catch, donc utiliser cet extrait try catch est en fait mieux que d'attraper un tas de types d'exceptions différents et de ne rien faire avec
Lou Morda

1
@LouisMorda Je ne suis pas d'accord, attraper chaque sous-classe d'exception et ne rien faire en fonction d'elles (les ignorer) est pire que d'attraper seulement quelques exceptions spécifiques et de les ignorer. Si vous attrapez certains types d'exceptions et ne faites rien avec les informations, vous n'avez aucune chance de savoir ce qui n'a pas fonctionné dans ces situations, mais si vous attrapez toutes les sous-classes d'exceptions, vous n'avez aucune chance de savoir ce qui a mal tourné dans un très grand nombre. des situations. Pensez à la façon dont vous géreriez les rapports de bogue sans les informations des exceptions, comme les traces de pile et les messages.
zpon

6

Attraper Exception est une mauvaise pratique - c'est tout simplement trop large et vous risquez de manquer 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.


1
Attraper Exception est une mauvaise pratique. Pourquoi? downvote mal expliqué
Pedro Sequeira

4

Oui il y a.

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

4

Vous pouvez intercepter plusieurs exceptions dans un seul bloc catch.

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

3

Voulez-vous dire attraper un Exceptionde n'importe quel type qui est lancé, par opposition à seulement des 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...
}

Que dois-je faire pour ceux qui ne sont pas spécifiques ??
Johanna

et j'attraperai toutes ces exceptions spécifiques avec catch (Exception e) {} ??
Johanna
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.