Excepciones en PHP

De entrada ha de quedar claro : una excepción no es un error.

¿Qué es un error?

Un error es un funcionamiento incorrecto de nuestro código, como puede ser intentar abrir un fichero que no existe, utlizar variables no definiadas …etc.  En un articulo anterior ya hablaba del Manejo de errores en PHP.

¿Qué es una excepción?

Cuando a nivel de código detectamos que algo está saliendo mal: los datos están vacíos, no existe el fichero que queríamos abrir …. etc, lanzamos un aviso para interrumpir el flujo normal del programa y realizar otra acción más adecuada.

Las excepciones son otra forma de control de flujo, como lo son  if / else , while o foreach.

¿Debería usar excepciones?

No hay nada en las excepciones que no se pueda hacer con un if.

Si se usan bien, las excepciones pueden hacer tu código más compacto y claro. Pero si se usan para un control de flujo entre diferentes partes del programa puede hacer de tu código un auténtico lío.

¿Cómo se usan las excepciones?

Una excepción es un aviso que interrumpe el flujo normal del programa, si nadie se hace cargo de ella se generará un error . Una excepción puede ser lanzada (thrown), y tiene que ser atrapada («catched»);

Las excepciones son objetos de la clase Exception. Lanzar una excepción es algo asi:

throw new Exception('Esto es una excepción.');

(Pista : La clase Exception puede ser heredada, ampliada …. para poder crear nuestros propios tipos de excepciones …. ¿se va viendo la idea? ).

Para poder capturar una excepción esta debe ser lanzada dentro de un bloque try {} y  debe tener al menos (puede haver más) un bloque catch{}. :

try{
     if(!$x) throw new Exception('División por cero.');
     $inverso = 1/$x;
}catch (Exception $e){
     echo 'Excepción capturada: ',  $e->getMessage(), "\n";
}

Este código es bastante chorra, pero lo he puesto así para que quede claro que el throw debe estar dentro de un bloque try.
Si lo ponemos de esta  otra forma:

function calcularInverso ($x){
     if(!$x) throw new Exception('División por cero.');
     retun 1/$x;
}

try {
   echo calcularInverso(4);
   echo calcularInverso(10);
   echo calcularInverso(0);

}catch (Exception $e){
     echo 'Excepción capturada: ',  $e->getMessage(), "\n";
}

Queda mucho más clara la utilidad de las excepciones.

La clase exception

En el sitio de la documentación oficial de php podéis ver como está definida la clase Exception  y sus métodos. Los más importantes:

  • getMessage — Obtiene el mensaje de Excepción
  • getFile — Obtiene el fichero en el que ocurrió la excepción
  • getLine — Obtiene la línea en donde ocurrió la excepción