ConstructiCat Logo
CodeBust.
Browse section ▾

Замена исключения проверкой условия.

Problem

Вы выбрасываете исключение там, где можно было бы обойтись простой проверкой условия.

Solution

Замените выбрасывание исключения проверкой этого условия.

##Example

Before
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
After
double getValueForPeriod(int periodNumber) {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

##Why Refactor

Исключения должны использоваться для обработки внештатного поведения, связанного с неожиданной ошибкой. Они не должны служить заменой проверкам выполнения условий. Если исключения можно избежать, просто проверив какое-то условие перед выполнением действия, то стоит так и сделать. Исключения следует приберечь для настоящих ошибок.

Например, вы зашли на минное поле и там подорвались, вызвав исключение; исключение успешно обработалось и вас вынесло за пределы минного поля. Вместо этого можно бы было просто прочитать указатель перед минным полем и обойти его другой дорогой.

##Benefits

  • Простой условный оператор иногда может быть очевиднее блока обработки исключения.

##How to Refactor

  1. Создайте условный оператор для граничного случая и поместите его перед try/catch блоком.

  2. Переместите код из catch-секции внутрь этого условного оператора.

  3. В catch-секции поставьте код выбрасывания обычного безымянного исключения и запустите все тесты.

  4. Если никаких исключений не было выброшено во время тестов, избавьтесь от оператора try/catch.