Manejo de Excepciones

Una excepción es cualquier incidente que no permite la terminación correcta de un programa. Puede ser inducida o involuntaria.

En la mayoría de los casos se tratará de impedir la terminación de los programas manejando las excepciones o lanzándolas hacia algún punto del programa que pueda manejar dicha excepción.

Bloque try-catch

Existe una configuración específica para manejar una excepción.

  • Bloque try: colocamos el código que podría contener una excepción.
  • Bloque catch: en caso de que ocurra una excepción se ejecutará este bloque. Aquí se puede controlar una excepción, mandar un aviso del suceso o lanzarlo a otro lugar que pueda capturarlo. Cabe mencionar que puede permitirse varios bloques catch, para establecer excepciones especificas en cada uno de ellos. En esos casos se inicia con la excepción mas especifica hasta finalizar con la más general.
  • Bloque finally: Este es opcional y se ejecutará al final, exista o no una excepción.


<?php
try {
// Aquí se prueba el código
}
catch(Exception $e) {
// Captura o lanzamiento de la excepción
}
finally {
// Opcional, pero si existe ocurrirá halla excepción o no
}

Lanzamiento de Excepción

Cuando se ha establecido que una parte del código puede presentar una excepción ya sea por los limites del propio lenguaje o porque se ha decidido que bajo circunstancias establecidas se presente una interrupción, se habla de que se realiza un lanzamiento de una excepción. Esto se realiza cuando no es posible controlar la excepción y se desea enviar a un lugar en el cual pueda ser tratado correctamente.

Algo importante de mencionar es que si el codificar lanza una excepción, debe estar preparado para capturarla en algún lugar, ya que de no hacerlo causara una ruptura en el flujo del programa (lo cual es lo que se quiere evitar).


<?php
function inverso($x)
{
if (!$x) {
// Se crea un objeto de tipo Exception, que será lanzado
// para que en otro lado pueda controlarse
throw new Exception ('División por cero.');
}
return 1 / $x;
}

view raw

throw.php

hosted with ❤ by GitHub

Excepciones Personalizadas

La clase Exception permite la herencia y por consiguiente reutilizar y rescribir las operaciones necesarias.


<?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;
}

Errores en PHP

Existen ciertos errores que no son capturados por las excepciones en PHP, al menos no de forma directa. Existen 3 categorías de estos errores:

NOTICE: Indican que el programa encontró algo que podría indicar un error, y que podría suceder en el curso normal de la ejecución de un script.

WARNING: La ejecución del programa no se detiene.

ERROR: Ocurre dentro del programa y evita la secuencia lógica del programa.

Para mostrar u ocultar estos errores se utiliza la función error_reporting(), el cual utiliza los siguientes parámetros.

Es importante saber que error_reporting() funciona si el archivo de configuración php.ini, tiene el valor Display_errors = On. En caso de no tener acceso a este archivo de configuración, es posible establecer en tiempo de ejecución dicho valor. Esto se hace utilizando la función ini_set(), la cual se encarga de establecer valores de configuración en tiempo de ejecución. Sin embargo, es una solución incompleta debido a que si existe un error sintáctico en el archivo donde se llama esta función no podrá visualizarse dicho error.


<?php
// Establecer que se desean observar errores
ini_set('display_errors', 1);
// Que tipo de información se mostrará
error_reporting(E_ALL);

Es de hacer notar que en ambientes de producción los mensajes de error no deben visualizarse por sencillas razones:

  • El mensaje no ayuda al usuario final
  • Mostrar errores puede contener algún tipo de informacion que puede servir a un atacante externo.