Blog de Gonzalo

EXCEPCIONES EN PHP

Llevo ya unos años trabajando como programador y recuerdo que en mi primer trabaj como programado fue programando en coldfusion y tuve que controlar una funcionalidad del código con una excepción y claro yo no sabía lo que era y estuve investigando y lo hice. Luego en casa estuve mirando como tratar excepciones en php en aquella época estaba la versión 4 de php y todavía no se podían controlar pero leí que se podían tratar a partir de la versión 5.
Para los novatos de programación una excepción consta de tres partes:

  • Try:Dentro de este bloque irá el código a ejecutar.
  • Catch:Dentro de este bloque irá el código para capturar la excepción prducida. Pueden haber varios bloques catch para tratar varias excepciones.
  • Finally:Este bloque siempre se ejecutará independientemente de que se haya lanzado una excepción o no, y antes de que la ejecución normal continúe. No es obligatorio.
Un ejemplo básico de una excepción sería:

 function sumar($num1, $num2){
    //Se comprueba si ambos números son numéricos.
    if(is_numeric($num1) and is_numeric($num2)){
       return $num1 + $num2;
    }else{
       //Se lanza una excepción.
       throw new Exception('Los valores a sumar tienen que ser numéricos');
       return 0;
    }
 }
 try{
    //Ejecutamos la función con números.
    echo sumar(15, 5);
 }catch(Exception $e){
    echo $e->getMessage();
 }

El ejemplo anterior es bastante sencillo y se puede ver el funcionamiento de las excepciones de una forma sencilla.
La clase Exception tiene los siguientes métodos que pueden ayudar para gestionar las excepciones:

  • getMessage: Obtiene el mensaje de Excepción. Se usa en el ejemplo anterior
  • getPrevious: Devuelve la excepción anterior.
  • getCode: Obtiene el código de Excepción. Este método es útil para añadir en el log de errores.
  • getFile: Obtiene el fichero en el que ocurrió la excepción. Este método es útil para añadir en el log de errores.
  • getLine: Obtiene la línea en donde ocurrió la excepción. Este método es útil para añadir en el log de errores.
  • getTrace:Obtiene el seguimiento de la pila. Este método es útil para añadir en el log de errores.
  • getTraceAsString ? Obtiene el stack trace como cadena.

Php permite personalizar las excepciones realizando una clase que extienda de la clase Exception pudiendo sobreescribir los métodos descritos anteriormente o añadiendo métodos nuevos. Veamos un ejemplo

class myException extends Exception {
  public function errorMessage() {
    //error message
    return 'Error en la línea '.$this->getLine().' en el fichero '.$this->getFile()
    .': '.$this->getMessage().'';
  }
}

$email = 'pepitoandmidominio.es';

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    throw new myException($email);
  }
}
catch (myException $e) {
  echo $e->errorMessage();
}

En el ejemplo anterior vemos que tenemos un email erróneo y al validarlo daría error y saltaría la excepción que hemos creado nosotros.
A veces, cuando se produce una excepción, es posible lanzar una excepción por segunda vez dentro de una catch del bloque. Una secuencia de comandos debe ocultar errores en el sistema de los usuarios. Los errores del sistema pueden ser importantes para el programador, pero no son de interés para el usuario. Para hacer las cosas más fáciles para el usuario puede volver a emitir la excepción con un mensaje fácil de leer y de entender sin tecnicismos de programación.
En los ejemplos que hemos usado hasta ahora se ha usado la clase Exception pero hay otras excepciones según el caso. Funcionan igual pero para su caso específico, y también s epeuden extender para personalizar errores:
  • BadFunctionCallException: Lanza una excepción si la llamada de retorno hace referencia a una función no definida o faltan algunos de los argumentos.
  • BadMethodCallException: Lanza una excepción si la llamada de retorno hace referencia a una función no definida o faltan algunos de los argumentos.
  • DomainException: Excepción lanzada si un valor no se adhiere a un dominio definido de datos válidos. Por ejemplo para tratar tipos de imágenes
  • InvalidArgumentException: Excepción lanzada si un argumento no es del tipo previsto.
  • LengthException: Lanza una excepción si el valor longitud no es válido.
  • LogicException: Excepción que representa un error en la lógica del programa. Este tipo de excepciones debería conducir directamente a una reparación del código. Por ejemplo cuando una variable no existe
  • OutOfBoundsException: Lanza una excepción si el valor no es una clave válida. Representa los errores que no pueden ser detectados en tiempo de ejecucción.
  • OutOfRangeException: Lanza una excepción cuando se solicita un índice ilegal. Esto representa un error que debe ser detectado en tiempo de compilación.
  • OverflowException: Lanza una excepción cuando se agrega un elemento en un contenedor lleno.
  • RangeException: Excepción que se produce para indicar los errores de rango durante la ejecución del programa. Normalmente, esto significa que hubo un error aritmético distinto a bajo/sobre flujo. Esta es la versión en tiempo de ejecución de DomainException.
  • RuntimeException: Lanza una excepción si hay un error que sólo se puede encontrar en tiempo de ejecución.
  • UnderflowException: Lanza una excepción cuando se lleva a cabo una operación no válida o un contenedor vacío, tal como eliminar un elemento.
  • UnexpectedValueException : Lanza una excepción si un valor no coincide con un grupo de valores. Generalmente, esto sucede cuando una función llama a otra función y espera que el valor de retorno sea de cierto tipo o un valor aritmético no incluido o un errores relacionados con el buffer.

Hay veces que no es necesario crear una excepción y hay una manera de cnetralizar esas excepciones no capturadas y para eso hay que establecer una función de gestión de exceppciones no caputradas usando set_exception_handler donde se le indica dicha función. Veamos un ejemplo

set_exception_handler('exceptionHandler');
function exceptionHandler($e){
echo 'Se ha producido un error';
}
throw new Exception('Error');

Espero que os haya sido útil este post.

Compartir en twitter