ConstructiCat Logo
CodeBust.
Browse section ▾

Замена кода ошибки исключением.

Problem

Метод возвращает определенное значение, которое будет сигнализировать об ошибке.

Solution

Вместо этого следует выбрасывать исключение.

##Example

Before
int withdraw(int amount) {
  if (amount > _balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}
After
void withdraw(int amount) throws BalanceException {
  if (amount > _balance) {
    throw new BalanceException();
  }
  balance -= amount;
}

##Why Refactor

Возвращение кодов ошибок — давно устаревшая практика процедурного программирования. В современном программировании для обработки ошибок используются специальные классы, называемые исключениями. При возникновении проблемы вы «выбрасываете» такое исключение и оно впоследствии «ловится» одним из обработчиков исключений. При этом запускается специальный код обработки внештатной ситуации, который игнорируется в обычных условиях.

##Benefits

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

  • Классы исключений могут реализовывать собственные методы, а значит содержать часть функциональности по обработке ошибок (например, для перевода сообщений об ошибках).

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

##How to Refactor

Старайтесь выполнять шаги этого рефакторинга только для одного кода ошибки за один раз. Так будет легче удержать в голове все важные сведения и избежать ошибок.

  1. Найдите все вызовы метода, возвращающего код ошибки, и оберните его в try/catch блоки вместо проверки кода ошибки.

  2. Внутри метода вместо возвращения кода ошибки выбрасывайте исключение.

  3. Измените сигнатуру метода так, чтобы она содержала информацию о выбрасываемом исключении (секция @throws).