Logo ConstructiCat
CodeBust.
Parcourir la section ▾

Remplacer une exception par un test.

Problème

Vous levez une exception là où un simple test ferait l'affaire ?

Solution

Remplacez l'exception par un test conditionnel.

##Exemple

Avant
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
Après
double getValueForPeriod(int periodNumber) {
  if (periodNumber < 0 || periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

##Pourquoi refactoriser

Les exceptions doivent servir à gérer un comportement irrégulier lié à une erreur inattendue. Elles ne doivent pas remplacer un test. Si une exception peut être évitée en vérifiant simplement une condition avant l'exécution, alors faites-le. Les exceptions doivent être réservées aux véritables erreurs.

Par exemple, vous êtes entré dans un champ de mines et y avez déclenché une mine, provoquant une exception ; l'exception a été gérée avec succès et vous avez été projeté dans les airs jusqu'à un endroit sûr au-delà du champ de mines. Mais vous auriez pu éviter tout cela en lisant simplement le panneau d'avertissement placé à l'entrée du champ de mines.

##Avantages

  • Une simple condition peut parfois être plus évidente que du code de gestion d'exceptions.

##Comment refactoriser

  1. Créez une condition pour le cas limite et placez-la avant le bloc try/catch.

  2. Déplacez le code de la section catch à l'intérieur de cette condition.

  3. Dans la section catch, placez le code qui lève une exception habituelle anonyme et lancez tous les tests.

  4. Si aucune exception n'a été levée pendant les tests, débarrassez-vous de l'instruction try/catch.