Créer une exception personnalisée en Java

1. Introduction

Dans ce didacticiel, nous verrons comment créer une exception personnalisée en 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 liées à la programmation.

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

Les principales raisons de l'introduction d'exceptions personnalisées sont:

  • Exceptions de logique métier - Exceptions spécifiques à la logique métier et au flux de travail. 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 vérifié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 renvoie 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 lève FileNotFoundException, 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 classe java.lang.Exception .

Voyons un exemple de cela en créant une exception vérifiée personnalisée appelée IncorrectFileNameException:

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

Notez que nous devons également fournir un constructeur qui prend une chaîne 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.

Ensuite, voyons comment nous pouvons 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 maintenant savoir quelle est l'exception exacte. Est-ce assez? Nous perdons par conséquent la cause première de l'exception .

Pour résoudre ce problème, nous pouvons également ajouter un paramètre java.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, le IncorrectFileNameException 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 des exceptions personnalisées sans perdre la cause première à partir de laquelle elles se sont produites .

4. Exception non cochée personnalisé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 non cochée personnalisée similaire à la précédente, car cette erreur ne sera détectée que pendant l'exécution.

Pour créer une exception non contrôlée personnalisée, nous devons étendre la classe java.lang.RuntimeException :

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

Par conséquent, nous pouvons utiliser cette exception non cochée personnalisé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 servir d'outil utile pour une meilleure gestion des exceptions et une meilleure journalisation.

Le code des exemples utilisés dans cet article est disponible à l'adresse over sur Github.