Весняний РОЗПРОДАЖ

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

Також відомий як: Replace Exception with Test

Проблема

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

Рішення

Замініть викидання виключення перевіркою цієї умови.

До
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
Після
double getValueForPeriod(int periodNumber) {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}
До
double GetValueForPeriod(int periodNumber) 
{
  try 
  {
    return values[periodNumber];
  } 
  catch (IndexOutOfRangeException e) 
  {
    return 0;
  }
}
Після
double GetValueForPeriod(int periodNumber) 
{
  if (periodNumber >= values.Length) 
  {
    return 0;
  }
  return values[periodNumber];
}
До
function getValueForPeriod($periodNumber) {
  try {
    return $this->values[$periodNumber];
  } catch (ArrayIndexOutOfBoundsException $e) {
    return 0;
  }
}
Після
function getValueForPeriod($periodNumber) {
  if ($periodNumber >= count($this->values)) {
    return 0;
  }
  return $this->values[$periodNumber];
}
До
def getValueForPeriod(periodNumber):
    try:
        return values[periodNumber]
    except IndexError:
        return 0
Після
def getValueForPeriod(self, periodNumber):
    if periodNumber >= len(self.values):
        return 0
    return self.values[periodNumber]
До
getValueForPeriod(periodNumber: number): number {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
Після
getValueForPeriod(periodNumber: number): number {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

Причини рефакторингу

Виключення повинні використовуватися для обробки позаштатної поведінки, пов’язаної з несподіваною помилкою. Вони не повинні служити заміною перевіркам виконання умов. Якщо виключення можна уникнути, просто перевіривши якусь умову перед виконанням дії, то варто так і зробити. Виключення слід приберегти для справжніх помилок.

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

Переваги

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

Порядок рефакторингу

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

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

  3. У catch-секції розташцуйте код викидання звичайного безіменного виключення і запустіть усі тести.

  4. Якщо ніяких виключень не було викинуто під час тестів, позбавтеся від оператора try/catch.