Заміна виключення перевіркою умови
Проблема
Ви викидаєте виключення там, де можна було б обійтися простою перевіркою умови.
Рішення
Замініть викидання виключення перевіркою цієї умови.
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];
}
Причини рефакторингу
Виключення повинні використовуватися для обробки позаштатної поведінки, пов’язаної з несподіваною помилкою. Вони не повинні служити заміною перевіркам виконання умов. Якщо виключення можна уникнути, просто перевіривши якусь умову перед виконанням дії, то варто так і зробити. Виключення слід приберегти для справжніх помилок.
Наприклад, ви зайшли на мінне поле і там підірвалися, викликавши виключення; виключення успішно обробилося і вас винесло за межі мінного поля. Замість цього можна б було просто прочитати знак перед мінним полем і обійти його іншою дорогою.
Переваги
- Простий умовний оператор іноді може бути очевиднішим за блок обробки виключення.
Порядок рефакторингу
-
Створіть умовний оператор для граничного випадку і розташуйте його перед
try
/catch
блоком. -
Перемістіть код з
catch
-секції всередину цього умовного оператора. -
У
catch
-секції розташцуйте код викидання звичайного безіменного виключення і запустіть усі тести. -
Якщо ніяких виключень не було викинуто під час тестів, позбавтеся від оператора
try
/catch
.