Logotipo de ConstructiCat
CodeBust.
Explorar la sección ▾

Reemplazar Código de Error con Excepción.

Problema

¿Un método devuelve un valor especial que indica un error?

Solución

Lanza una excepción en su lugar.

##Ejemplo

Antes
int withdraw(int amount) {
  if (amount > balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}
Después
void withdraw(int amount) throws BalanceException {
  if (amount > balance) {
    throw new BalanceException();
  }
  balance -= amount;
}

##Por qué refactorizar

Devolver códigos de error es un vestigio obsoleto de la programación procedimental. En la programación moderna, la gestión de errores la realizan clases especiales, llamadas excepciones. Si se produce un problema, «lanzas» un error, que luego es «capturado» por uno de los manejadores de excepciones. Se activa un código especial de gestión de errores, que se ignora en condiciones normales, para responder.

##Ventajas

  • Libera al código de una gran cantidad de condicionales para comprobar diversos códigos de error. Los manejadores de excepciones son una forma mucho más concisa de diferenciar las rutas de ejecución normales de las anómalas.

  • Las clases de excepción pueden implementar sus propios métodos, conteniendo así parte de la funcionalidad de gestión de errores (como el envío de mensajes de error).

  • A diferencia de las excepciones, los códigos de error no pueden usarse en un constructor, ya que un constructor debe devolver únicamente un objeto nuevo.

##Cómo refactorizar

Intenta realizar estos pasos de refactorización para un solo código de error a la vez. Esto facilitará mantener toda la información importante en tu cabeza y evitar errores.

  1. Encuentra todas las llamadas a un método que devuelve códigos de error y, en lugar de comprobar un código de error, envuélvela en bloques try/catch.

  2. Dentro del método, en lugar de devolver un código de error, lanza una excepción.

  3. Cambia la firma del método para que contenga información sobre la excepción que se lanza (sección @throws).