Cuando creamos un programa puede haber ciertas situaciones que causan error en la ejecución del mismo. En estos casos, conocidos o advertidos por el programador, pueden gestionarse para evitar la desagradable ventana de error.
Esta forma de gestionar los casos de error se llaman en PHP excepciones. Se declaran a través de la instrucción throw. No basta con declarar las excepciones sino que se completa la gestión con el uso de los bloques try, catch, finally que básicamente funcionan de la siguiente forma.
Si se produce un error en el bloque try la ejecución pasa directamente al bloque catch recuperando el objeto Exception y, desde PHP 5.5, el bloque finally se ejecuta se dé o no la excepción (el error).
Veamos todo esto con un caso práctico:
Se trata de evitar la división por cero cuando se utiliza en el programa una función que realiza la inversa. El valor para calcular su inversa se pasa como parámetro a la función.
Ejemplo, sin gestión de excepción y una programación convencional
<?php // creamos la función function inversa ($valor) { if ($valor == 0) { echo "División por cero. Error<br>"; }else{ echo "La inversa de $valor es ". 1/$valor."<br>"; } } //script de uso de la función probando valores 2 y 0 echo "Probamos 2 como valor<br>"; inversa (2); echo "<hr>"; // línea horizontal echo "Probamos 0 como valor<br>"; inversa (0); ?>
Ejemplo gestionando la excepción y una programación orientada a objetos
<?php //creamos la función inversa function inversa ($valor) { if ($valor==0){ //declaración de la excepción throw new Exception ('División por cero.'); }else{ return 1/$valor; } } //fin function // ------------------------------ //Primera prueba valor = 2 $valor = 2; //iniciamos variable try { echo inversa ($valor)."<br>"; } catch (Exception $e) { //recuperación de la excepción echo 'Excepción : ', $e->getMessage(),"<br>"; } finally { echo "Fin de la primera prueba.<br>"; } // ------------------------------ //Segunda prueba valor = 0 $valor = 0; //iniciamos variable try { echo inversa ($valor)."<br>"; } catch (Exception $e) { //recuperación de la excepción echo 'Excepción : ', $e->getMessage(),"<br>"; } finally { echo "Fin de la segunda prueba.<br>"; } ?>