Php orientado a objetos, parte 9: Excepciones

En otros lenguajes de programación suele utilizarse mucho las excepciones, algo interesante y bastante útil a la hora de controlar el flujo de nuestros proyectos que puede llegar a romperse por causa de errores.

PHP 5 nos da la posibilidad de crear nuestras propias excepciones con la clase Exception y las sentencias try y catch. Si nunca has visto las sentencias try catch, la sintáxis es más o menos así:

try{
   //Ejecuta código que puede llegar a tener error.
 }catch(Exception $e){
   //Recupera un error de haberlo en lo anterior.
 }

Vamos a ver un ejemplo bastante sencillo. Supongamos que tenemos una función que recibe dos números y nos devuelve el valor de la suma de ambos:

<?php 
function sumar($numero1, $numero2){
   return $numero1 + $numero2;
}
?>

Luego la llamaríamos con:

<?php 
echo sumar(15, 5);
?>

Ahora bien, acá surge un posible problema y es que los valores ingresados podrían llegar a no ser numéricos, lo que provocaría que PHP nos lance un mensaje de error.

Para solucionar esto deberíamos abrir el paraguas de antemano y crear dentro de la función lo que se llama una excepción. La función entonces quedaría de la siguiente forma:

<?php 
 function sumar($numero1, $numero2){
   //Verifico si ambos valores ingresados son numéricos.
   if(is_numeric($numero1) and is_numeric($numero2)){
      return $numero1 + $numero2;
   }else{
      //Crea una excepción.
      throw new Exception('Los valores ingresados no son numéricos');
      return 0;
   }
 } 
?>

Cómo verán dentro de la función yo utilizo un if que verifica si ambos valores ingresados son numéricos con la función de PHP is_numeric(), que recibirá un parámetro y de ser númerico me devolverá true. Si ambos dan true, osea que son numéricos se realizará la suma así retornando el valor de la misma, pero de lo contrario creará una nueva excepción como se ve en el ejemplo:

throw new Exception('Mensaje de error');

Ahora probaremos ejecutar el código:

<?php 
 function sumar($numero1, $numero2){
    //Verifico si ambos valores ingresados son numéricos.
    if(is_numeric($numero1) and is_numeric($numero2)){
       return $numero1 + $numero2;
    }else{
       //Crea una excepción.
       throw new Exception('Los valores ingresados no son numéricos');
       return 0;
    }
 }
 try{
    //Ejecutamos la función con números.
    echo sumar(15, 5);
 }catch(Exception $e){
    echo $e->getMessage();
 }
?>

El bloque de código devuelve por pantalla: «20». Lo que significa que la función se ejecutó sin problemas y por eso no capturó ningún error. Pero probemos con esto:

<?php 
 function sumar($numero1, $numero2){
   //Verifico si ambos valores ingresados son numéricos.
   if(is_numeric($numero1) and is_numeric($numero2)){
      return $numero1 + $numero2;
   }else{
      //Crea una excepción.
      throw new Exception('Los valores ingresados no son numéricos');
      return 0;
   }
 }
 try{
   //Ejecutamos la función con parámetros incorrectos
   echo sumar('Saraza', 'EAEA');
 }catch(Exception $e){
   echo $e->getMessage();
 }
?>

En este últimos caso llamamos a la función sumar(), pero con parámetros que son incorrectos. Lo ejecutamos desde el bloque try, pero la misma dispara un error que es capturado y mostrado por pantalla desde el bloque catch. $e en realidad es un objeto que se crea dentro de catch (si se produce el error)

Los métodos disponibles para dicho objetos son:

getMessage() — Obtiene el mensaje de Excepción
getPrevious() — Devuelve la excepción anterior
getCode() — Obtiene el código 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
getTrace() — Obtiene el seguimiento de la pila
getTraceAsString() — Obtiene el stack trace como cadena

(Fuente: https://php.net/manual/es/class.exception.php)

El ejemplo mencionado en este post es muy útil para saber cómo trabajan las excepciones, sin embargo este tipo de cosas como recibir parámetros erróneos no es la forma correcta que requiera un manejo de errores. Lo correcto en este caso hubiese sido validar previamente que los valores ingresados sean numéricos antes de llamar a la función y de ser incorrectos redireccionar al usuario a una página de error de validación.

Otra cosa que es conveniente aclarar es que el manejo de errores tampoco debería ser utilizado para controlar errores del programador, sino errores posibles que el programador no puede controlar. Un ejemplo perfecto es intentarse conectar a una base de datos que no está funcionando.  El programador escribe el código para conectarse a la base de datos, el código no contendrá errores, pero si la base de datos en un futuro no funciona el script se romperá.

En el próximo posteo veremos esto:

Saludos!

Anterior: Php orientado a objetos, parte 8: Propiedades y métodos estáticos

Siguiente: Php orientado a objetos, parte 10: PDO, Conectarse a una base de datos