Saltar la navegación

4.1.- Excepciones.

Imagen de un rombo amarillo, en el interior en negro el icono de un hombre simulando trabajar con una pala y encima, tachandolo, una x roja.
Everaldo Coelho (GNU/GPL)


 A partir de la versión 5 se introdujo en PHP un modelo de excepciones similar al existente en otros lenguajes de programación:

  • El código susceptible de producir algún error se introduce en un bloque try.
  • Cuando se produce algún error, se lanza una excepción utilizando la instrucción throw.
  • Después del bloque try debe haber como mínimo un bloque catch encargado de procesar el error.
  • Si una vez acabado el bloque try no se ha lanzado ninguna excepción, se continúa con la ejecución en la línea siguiente al bloque o bloques catch.

Por ejemplo, para lanzar una excepción cuando se produce una división por cero podrías hacer:

try {
    if ($divisor == 0)
    throw new Exception("División por cero.");
    $resultado = $dividendo / $divisor;
}catch (Exception $e) {
    echo "Se ha producido el siguiente error: ".$e->getMessage();
}

PHP ofrece una clase base Exception para utilizar como manejador (handler) de excepciones. Para lanzar una excepción no es necesario indicar ningún parámetro, aunque de forma opcional se puede pasar un mensaje de error (como en el ejemplo anterior) y también un código de error.
Entre los métodos que puedes usar con los objetos de la clase Exception están:

  • getMessage. Devuelve el mensaje, en caso de que se haya puesto alguno.
  • getCode. Devuelve el código de error si existe.

Las funciones internas de PHP y muchas extensiones como MySQLi usan el sistema de errores visto anteriormente. Solo las extensiones más modernas orientadas a objetos, como es el caso de PDO, utilizan este modelo de excepciones. En este caso, lo más común es que la extensión defina sus propios manejadores de errores heredando de la clase Exception (veremos cómo utilizar la herencia en una unidad posterior).

Para saber más

Utilizando la clase ErrorException es posible traducir los errores a excepciones.

Clase ErrorException.

Vimos en el apartado 3.2.1 que la clase PDO permitia definir la fórmula que usará cuando se produzca un error, utilizando el atributo PDO::ATTR_ERRMODE. Las posibilidades eran:

  • PDO::ERRMODE_SILENT.
  • PDO::ERRMODE_WARNING.
  • PDO::ERRMODE_EXCEPTION. Cuando se produce un error lanza una excepción utilizando el manejador propio PDOException.

Es decir, que si quieres utilizar excepciones con la extensión PDO, debes configurar la conexión haciendo:

$conProyecto->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Por ejemplo, el siguiente código:

$host = "localhost";
$db = "proyecto";
$user = "gestor";
$pass = "1234";
$dsn = "mysql:host=$host;dbname=$db"; 
try {
    $conProyecto = new PDO($dsn, $user, $pass);
    $conProyecto->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $ex) {
            die("Error en la conexion, mensaje de error:  " . $ex->getMessage());
}

Captura la excepción que lanza PDO debido a que la contraseña era "secreto" y no "1234". El bloque catch muestra el siguiente mensaje:

Error en la conexion, mensaje de error: SQLSTATE[HY000] [1045] Access denied for user 'gestor'@'localhost' (using password: YES)

Ejercicio resuelto

Agrega control de excepciones para controlar los posibles errores de conexión que se puedan producir en el último ejercicio del apartado 3.2.4. Mostraremos los posible errores abajo de la página.

Autoevaluación

Pregunta

¿Cuántos bloques "catch" se han de utilizar después de un bloque "try"?

Respuestas

Uno.

Uno o más.

Retroalimentación