Lors du développement Java, la gestion des erreurs repose sur un mécanisme de'xceptions robuste. Lorsqu'une opération peut échouer de manière prévisible, il est courant de lever explicitement une exception pour signaler le problème au code appelant.
public class Calculatrice {
public static void main(String[] args) {
try {
effectuerDivision(10, 0);
} catch (ArithmeticException exc) {
System.err.println("Erreur arithmétique interceptée : " + exc.getMessage());
}
}
public static void effectuerDivision(int dividende, int diviseur) {
if (diviseur == 0) {
throw new ArithmeticException("Division par zéro non autorisée.");
}
System.out.println("Résultat : " + (dividende / diviseur));
}
}
Dans l'exemple ci-dessus, la méthode effectuerDivision vérifie une condition d'erreur et, si elle est remplie, utilise l'instruction throw pour propager une exception de type ArithmeticException. Le bloc try-catch dans la méthode main permet d'intercepter et de traiter cette exception de manière contrôlée.
Pour des scénarios d'erreur métier spécifiques, il est souvent nécessaire de définir ses propres classes d'exception. Une exception personnnalisée étend généralement la classe Exception (pour les exceptions vérifiées) ou RuntimeException (pour les exceptions non vérifiées).
// Définition d'une exception personnalisée
public class ValeurHorsLimitesException extends Exception {
private final int valeur;
public ValeurHorsLimitesException(String message, int valeur) {
super(message);
this.valeur = valeur;
}
public int getValeur() {
return valeur;
}
}
// Utilisation de l'exception personnalisée
public class ValidateurDonnees {
public static void validerPlage(int valeur) throws ValeurHorsLimitesException {
if (valeur < 0 || valeur > 100) {
throw new ValeurHorsLimitesException(
"La valeur doit être comprise entre 0 et 100.", valeur
);
}
System.out.println("Valeur valide : " + valeur);
}
public static void main(String[] args) {
try {
validerPlage(150);
} catch (ValeurHorsLimitesException e) {
System.err.println("Validation échouée : " + e.getMessage());
System.err.println("Valeur reçue incorrecte : " + e.getValeur());
}
}
}
Lors de la conception d'une gestion d'exceptions efficace, plusieurs principes doivent guider le développement :
- Anticiper les situations d'erreur courantes par une logique de validation plutôt que de se reposer uniquement sur les
try-catch. - Ordonner les blocs
catchdu type le plus spécifique au plus général pour éviter les blocs inaccessibles. - Toujours viser à récupérer proprement d'une exception, en évitant de simplement l'afficher avec
printStackTrace()dans un contexte de production. - Utiliser le bloc
finallypour libérer systématiquement les ressources critiques (connexions, flux d'entrée/sortie, verrous, etc.).