Créer une exception personnalisée en Java

Créer une exception personnalisée en Java

1. introduction

Dans ce didacticiel, nous aborderonshow to create a custom exception in Java.

Nous montrerons comment les exceptions définies par l'utilisateur sont implémentées et utilisées pour les exceptions cochées et non cochées.

2. Le besoin d'exceptions personnalisées

Les exceptions Java couvrent presque toutes les exceptions générales qui sont inévitables dans la programmation.

Cependant, nous devons parfois compléter ces exceptions standard avec les nôtres.

Les principales raisons d'introduire des exceptions personnalisées sont les suivantes:

  • Exceptions de la logique applicative - Exceptions spécifiques à la logique applicative et au workflow. Ceux-ci aident les utilisateurs de l'application ou les développeurs à comprendre quel est le problème exact

  • Pour capturer et fournir un traitement spécifique à un sous-ensemble d'exceptions Java existantes

Les exceptions Java peuvent être cochées et décochées. Dans les sections suivantes, nous couvrirons ces deux cas.

3. Exception vérifiée personnalisée

Les exceptions cochées sont des exceptions qui doivent être traitées explicitement.

Considérons un morceau de code qui retourne la première ligne du fichier:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) return file.nextLine();
} catch(FileNotFoundException e) {
    // Logging, etc
}

Le code ci-dessus est un moyen classique de gérer les exceptions vérifiées par Java. Bien que le code renvoieFileNotFoundException,, la cause exacte n’est pas claire - si le fichier n’existe pas ou si le nom du fichier n’est pas valide.

Pour créer une exception personnalisée, nous devons étendre la classejava.lang.Exception.

Voyons un exemple en créant une exception cochée personnalisée appeléeIncorrectFileNameException:

public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }
}

Notez que nous devons également fournir un constructeur qui prend unString comme message d'erreur et appelle le constructeur de classe parent.

C'est tout ce que nous devons faire pour définir une exception personnalisée.

Voyons maintenant comment utiliser l’exception personnalisée dans notre exemple:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine())
        return file.nextLine();
} catch (FileNotFoundException e) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException("Incorrect filename : " + fileName );
    }
    //...
}

Nous avons créé et utilisé une exception personnalisée afin que l'utilisateur puisse désormais savoir quelle est l'exception exacte. Est-ce assez? Nous sommes par conséquentlosing the root cause of the exception.

Pour résoudre ce problème, nous pouvons également ajouter un paramètrejava.lang.Throwable au constructeur. De cette façon, nous pouvons passer l'exception racine à l'appel de méthode:

public IncorrectFileNameException(String errorMessage, Throwable err) {
    super(errorMessage, err);
}

Maintenant, leIncorrectFileNameException est utilisé avec la cause racine de l'exception comme ceci:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }
    // ...
}

C'est ainsi que nous pouvons utiliser les exceptions personnaliséeswithout losing the root cause from which they occurred.

4. Exception personnalisée non vérifiée

Dans notre même exemple, supposons que nous ayons besoin d'une exception personnalisée si le nom de fichier ne contient aucune extension.

Dans ce cas, nous aurons besoin d'une exception personnalisée non cochée similaire à la précédente, car cette erreur ne sera détectée que pendant l'exécution.

To create a custom unchecked exception we need to extend the java.lang.RuntimeException class:

public class IncorrectFileExtensionException
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}

Par conséquent, nous pouvons utiliser cette exception personnalisée non contrôlée dans notre exemple:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    } else {
        throw new IllegalArgumentException("Non readable file");
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }

    //...
} catch(IllegalArgumentException err) {
    if(!containsExtension(fileName)) {
        throw new IncorrectFileExtensionException(
          "Filename does not contain extension : " + fileName, err);
    }

    //...
}

5. Conclusion

Les exceptions personnalisées sont très utiles lorsque nous devons gérer des exceptions spécifiques liées à la logique métier. Lorsqu'ils sont utilisés correctement, ils peuvent constituer un outil utile pour améliorer la gestion des exceptions et la journalisation.

Le code des exemples utilisés dans cet article est disponibleover on Github.