---
title: "Substituir Exceção por Teste"
type: "refactoring-technique"
slug: "replace-exception-with-test"
url: "http://localhost:3000/pt-br/replace-exception-with-test.md"
category: "Simplifying Method Calls"
description: "Problema: Você lança uma exceção em um lugar onde um teste simples faria o trabalho? Solução: Substitua a exceção por um teste de condição."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Substituir Exceção por Teste

> Problema: Você lança uma exceção em um lugar onde um teste simples faria o trabalho? Solução: Substitua a exceção por um teste de condição.

## Problem

Você lança uma exceção em um lugar onde um teste simples faria o trabalho?

## Solution

Substitua a exceção por um teste de condição.

## Why Refactor

As exceções devem ser usadas para tratar comportamentos irregulares relacionados a um erro inesperado. Elas não devem servir como substituto para testes. Se uma exceção pode ser evitada simplesmente verificando uma condição antes da execução, então faça isso. As exceções devem ser reservadas para erros reais.

Por exemplo, você entrou em um campo minado e acionou uma mina ali, resultando em uma exceção; a exceção foi tratada com sucesso e você foi lançado pelos ares até a segurança, para além do campo minado. Mas você poderia ter evitado tudo isso simplesmente lendo, para começar, a placa de aviso em frente ao campo minado.

## Benefits

* Uma condicional simples às vezes pode ser mais óbvia do que código de tratamento de exceções.

## How to Refactor

1. Crie uma condicional para um caso de borda e mova-a para antes do bloco try/catch.
2. Mova o código da seção `catch` para dentro dessa condicional.
3. Na seção `catch`, coloque o código para lançar uma exceção comum, sem nome, e execute todos os testes.
4. Se nenhuma exceção foi lançada durante os testes, livre-se do operador `try`/`catch`.
## Relations

**Similar techniques**

- [Substituir Código de Erro por Exceção](/pt-br/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];
}
```

