4.6. Excepción

Una excepción es un evento que ocurre durante la ejecución de un programa y requiere de la ejecución controlada de un bloque de código fuera del flujo de normal de ejecución.

El manejo de excepciones es una herramienta muy potente a la hora de realizar una gestión de una situacion. Lo primero que hay que comprender es que una excepción no es un error. Es una situación que se experimenta un bloque de código y que este no es capaz de manejar.

PHP 5 tiene un modelo de excepciones similar al de otros lenguajes de programación. Una eexcepción puede ser lanzada ('thrown'), y atrapada ('catched') dentro de PHP. El código puede estar dentro de un bloque try para facilitar la captura de excepciones potenciales. Cada bloque try debe tener al menos un bloque catch o finally correspondiente.

El objeto lanzado debe ser una instancia de la clase Exception o una subclase de Exception. Intentar lanzar un objeto que no lo sea resultará en un Error Fatal de PHP.

catch

Se pueden usar múltiples bloques catch para atrapar diferentes clases de excepciones. La ejecución normal (cuando no es lanzada ninguna excepción dentro del bloque try) continuará después del último bloque catch definido en la sencuencia. Las excepciones pueden ser lanzadas ("thrown") (o relanzadas) dentro de un bloque catch.

Cuando una excepción es lanzada, el código siguiente a la declaración no será ejecutado, y PHP intentará encontrar el primer bloque catch coincidente. Si una excepción no es capturada, se emitirá un Error Fatal de PHP con un mensaje 'Uncaught Exception ...' ('Excepción No Capturada'), a menos que se haya definido un manejador con set_exception_handler().

finally

En PHP 5.5 y posterior, se puede utilizar un bloque finally después o en lugar de los bloques catch. El código de dentro del bloque finally siempre se ejecutará después de los bloques try y catch, independientemente de que se haya lanzado una excepción o no, y antes de que la ejecución normal continúe

.

Ejemplo: Calculo de la raíz cuadrada de un número

<?php
  //Creamos una función con excepción
  function raiz( $radical) {

    if( $radical < 0) {
	  throw new Exception('El radical debe ser mayoy o igual a cero');
   }
	return 'raiz('.$radical.') = '.sqrt($radical).'<br>';  
  } 
  
  try {
    echo raiz(25);
    echo raiz(-1);
  } catch(Exception $e) {
	   echo 'Mensaje: ' .$e->getMessage();
  }
?>

El código anterior produce una excepción y lo atrapa :

  1. En la función raiz( ) se comprueba si el radical es menor que cero. Si lo es, se produce una excepción
  2. La función de raiz( ) se llama en un bloque 'try'
  3. La excepción dentro de la función raiz( ) es lanzada
  4. El bloque 'catch' recupera la excepción y crea un objeto ( $e ) que contiene la información de excepción
  5. El mensaje de error de excepción se hizo eco llamando $e->getMessage( ) del objeto