Inicio > PHP > Curso PHP. Capítulo 13: Control de excepciones.

Curso PHP. Capítulo 13: Control de excepciones.

A partir de la versión 5, PHP incluye un mecanismo para controlar las excepciones con una sintaxis muy similar al mecanismo que incluye JAVA o C#. La principal diferencia con estos lenguajes es que las funciones nativas de la API de PHP no lanzan excepciones, al menos de momento.

PHP cuenta con dos tipos de excepciones predefinidas, Exception y ErrorException, y un conjunto de excepciones definidas en la SPL (standard PHP library).

Podemos lanzar excepciones manualmente utilizando la palabra clave throw:

throw new Exception('Mensaje');

El constructor de la clase Exception adopta una serie de parámetros opcionales, un mensaje y un código de error.

Para manejar las excepciones que lanzamos utilizamos la estructura de control try/catch. Todo el código que pueda lanzar una excepción debe incluirse dentro del bloque try ya que este bloque es el encargado de parar la ejecución del script y pasar el control al bloque catch cuando se produzca una excepción.

try
{

    // Codigo que puede lanzar excepciones

}
catch ( Exception $excepcion )
{

    // Codigo para controlar la excepcion

}

Puede haber más de un bloque catch asociado al mismo bloque try siempre que cada bloque catch espere capturar un tipo de excepción distinta. El objeto que se pasa al bloque catch es el objeto que se ha lanzado con la instrucción throw.

Vamos a ver un ejemplo para entender mejor el mecanismo de control de las excepciones:

<?php
try{
   throw new Exception('Se ha producido un error muy grave.');
}
catch(Exception $excepcion)
{
    echo $excepcion->getMessage();
}

echo 'El bloque catch no finaliza la ejecución total del script.';
?>

En este ejemplo lo que estamos haciendo es lanzar directamente una excepción de la clase Exception informando que se ha producido un error muy grave. Una vez lanzada la excepción, el bloque catch la captura y pasa a procesarla mostrando al usuario el mensaje que hemos utilizado en el constructor del objeto excepción. Para ello utilizamos el método getMessage(). La clase Exception cuenta con un conjunto de métodos que muestran información sobre la excepción que ha ocurrido:

getCode(): Devuelve el código tal cual se haya pasado al constructor. Si no pasamos ninguno por defecto devuelve el código de error cero.

getMessage(): Devuelve el mensaje tal cual se haya pasado al constructor. En nuestro caso devolvería la cadena ‘Se ha producido un error muy grave.’.

getFile(): Devuelve la ruta completa al archivo de código que haya lanzado la excepción.

getLine(): Devuelve el número de la línea del archivo de código en el que se ha producido la excepción.

getTrace(): Devuelve un array con la traza que indica dónde se ha producido la excepción.

getTraceAsString(): Devuelve la misma información que el anterior método pero con formato de cadena.

– También podemos utilizar el método mágico __toString() para customizar la información que mostramos sin imprimimos directamente el objeto excepción.

Cabe destacar que realmente no deberíamos mostrar está información al usuario en un entorno de producción debido que muestra información sensible de como está desarrollado nuestra aplicación. Una solución efectiva es mostrar siempre una plantilla de error básica que informe un poco del error ocurrido y darle la opción al usuario de volver al inicio o a la página anterior.

Podemos crear nuestras propias excepciones personalizadas si creamos una clase que herede de la clase base Exception, pero no podemos modificar el comportamiento de la mayoría de métodos ya que están declarados como finales. Para personalizar el mensaje de error podemos modificar el comportamiento del método mágico __toString(). Vamos a ver un ejemplo de excepción personalizada:

<?php

class MiExcepcionPersonalizada extends Exception
{

  function __toString()
  {
     return $this->getMessage();
  }

}

try{
   throw new MiExcepcionPersonalizada('Se ha producido un error muy grave.');
}
catch(MiExcepcionPersonalizada $excepcion)
{
   echo $excepcion;
}

?>

Como hemos visto podemos lanzar excepciones y manejarlas utilizando el mecanismo de control de excepciones de PHP. Importante destacar que de momento ninguna función nativa de PHP lanza por sí solas excepciones. Los errores comunes de PHP que se muestran en el navegador si tenemos las directivas de mostrar errores en on, no son mapeadas a expeciones automáticamente. No sé si en versiones posteriores de PHP los errores típicos que suprimimos con el operador @ podrán ser controlados de esta forma. Estaría genial que PHP se convirtiera con el tiempo en un lenguaje totalmente orientado a objetos.

Categorías: PHP Etiquetas: ,
  1. Jose Luis
    5 abril, 2011 a las 22:09

    Hola buen día, muy buen artículo, una pregunta, cuando mencionas funciones nativas, por ejemplo si la función mysqli_query genera un error, esta no lanza excepciones?? tengo un bloque de código y en el try tengo una consulta que generar un error sin embargo termina el try, y el catch se lo pasa de largo.
    Es posible usar try y catch en esos casos?

    por cierto estoy usando la versión 5.0 de PHP

    saludos.

  2. Jose Luis
    6 abril, 2011 a las 18:43

    Okidoki, gracias, por el dato.

    Saludos

  3. crisalers
    11 May, 2011 a las 11:20

    hey esta muy buena la informacion de tu paguina… gracias por la ayuda…. :) !!!! ha y si puedes colocar algo sobre las excepciones personalizadas en php haslo porfa me salvarias la vida

  1. No trackbacks yet.

Deja un comentario