---
title: "Замена исключения проверкой условия"
type: "refactoring-technique"
slug: "replace-exception-with-test"
url: "http://localhost:3000/ru/replace-exception-with-test.md"
category: "Упрощение вызовов методов"
description: "Проблема: Вы выбрасываете исключение там, где можно было бы обойтись простой проверкой условия. Решение: Замените выбрасывание исключения проверкой этого условия."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Замена исключения проверкой условия

> Проблема: Вы выбрасываете исключение там, где можно было бы обойтись простой проверкой условия. Решение: Замените выбрасывание исключения проверкой этого условия.

## Problem

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

## Solution

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

## Why Refactor

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

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

## Benefits

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

## How to Refactor

1. Создайте условный оператор для граничного случая и поместите его перед `try`/`catch` блоком.
2. Переместите код из `catch`\-секции внутрь этого условного оператора.
3. В `catch`\-секции поставьте код выбрасывания обычного безымянного исключения и запустите все тесты.
4. Если никаких исключений не было выброшено во время тестов, избавьтесь от оператора `try`/`catch`.
## Relations

**Similar techniques**

- [Замена кода ошибки исключением](/ru/replace-error-code-with-exception.md)

## Code Examples

### java

```java
// 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];
}
```

### csharp

```csharp
// Before
double GetValueForPeriod(int periodNumber) 
{
  try 
  {
    return values[periodNumber];
  } 
  catch (IndexOutOfRangeException e) 
  {
    return 0;
  }
}

// After
double GetValueForPeriod(int periodNumber) 
{
  if (periodNumber >= values.Length) 
  {
    return 0;
  }
  return values[periodNumber];
}
```

### php

```php
// Before
function getValueForPeriod($periodNumber) {
  try {
    return $this->values[$periodNumber];
  } catch (ArrayIndexOutOfBoundsException $e) {
    return 0;
  }
}

// After
function getValueForPeriod($periodNumber) {
  if ($periodNumber >= count($this->values)) {
    return 0;
  }
  return $this->values[$periodNumber];
}
```

### python

```python
// Before
def getValueForPeriod(periodNumber):
    try:
        return values[periodNumber]
    except IndexError:
        return 0

// After
def getValueForPeriod(self, periodNumber):
    if periodNumber >= len(self.values):
        return 0
    return self.values[periodNumber]
```

### typescript

```typescript
// Before
getValueForPeriod(periodNumber: number): number {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}

// After
getValueForPeriod(periodNumber: number): number {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}
```

