Gestión de errores en CodeIgniter

CodeIgniter incorpora un sistema propio para detectar y mostrar errores. Por defecto muestra todos los errores por pantalla. La alternativa es desactivar los mensajes de error pero si algo sale mal no sabremos porqué.

En general el comportamiento se controla desde la fichero **index.php** principal, que comienza así:

define('ENVIRONMENT', 'development');
/*
 *---------------------------------------------------------------
 * ERROR REPORTING
 *---------------------------------------------------------------
 *
 * Different environments will require different levels of
 *    error reporting.
 * By default development will show errors but testing and live will
 *    hide them.
 */

if (defined('ENVIRONMENT'))
{
   switch (ENVIRONMENT)
   {
      case 'development':
         error_reporting(E_ALL);
         break;

      case 'testing':
      case 'production':
         error_reporting(0);
      break;

      default:
         exit('The application environment is not set correctly.');
   }
}

Como vemos en el código anterior, el propio fichero **index.php** define la directiva del fichero php.ini al nivel **E_ALL** usando la función PHP **error_reporting()**.De esta forma CodeIgniter mostrará todos los mensajes de error y advertencias soportados, excepto los de nivel **E_STRICT** (según el manual si usamos esta directiva PHP mostraría mensajes para realizar cambios en nuestro código para asegurar mejor la interoperabilidad y compatibilidad con versiones posteriores del mismo) En la sesión de gestión de errores hablamos de que es recomendable modificar dicha directiva en el **php.ini** que estemos usando en desarrollo por la combinación **E_ALL | E_STRICT**. Por una parte, si tenemos activo ese nivel de errores no hace falta incluir esta línea, ya que, es un procesamiento extra. Por otra parte, el tiempo de procesamiento de dicha instrucción es depreciable, por lo que dejaremos esa línea tal cual y además incluiremos esta combinación **E_ALL | E_STRICT** mientras estemos desarrollando la aplicación. Finalmente el nivel de errores quedará tal que así:

...
   switch (ENVIRONMENT)
   {
      case 'development':
    error_reporting(E_ALL | E_STRICT);
...

En el manual de CodeIgniter nos recomiendan que por razones de seguridad modifiquemos esta línea en caso de llevar nuestra aplicación a producción. Como el fichero **index.php** de CodeIgniter es el único punto de entrada a la aplicación, podemos establecer el nivel de errores a 0 como medida de precaución en caso de que no podamos modificar el fichero php.ini, quedando algo así:

error_reporting (0);

Esto podría ser adecuado en una aplicación en producción, donde no queremos que sean visibles ningún tipo de mensajes de error ni de advertencias. Aún así disponemos de herramientas para que se almacenen en un fichero de log cualquier error que se produzca en la aplicación.

CodeIgniter proporciona tres funciones interesantes:

  • show_error()

  • show_404()

  • log_message()

Estas funciones nos permiten controlar cómo se muestran los errores en el sistema.Estas funciones están disponibles a nivel global, es decir, no tenemos que cargar ninguna librería para poder usarlas. De hecho, **show_error()** y **show_404()** generalmente se generan de forma predeterminada, la primera muestra el error en una pequeña caja preformateada en formato HTML en la parte superior de la pantalla, y la segunda muestra una página de tipo 404 si intentamos acceder a una página inexistente.

Aquí vemos un ejemplo donde dentro del controlador **libros** tenemos una acción **ver()** la cual comprueba si el segmento 3 de la uri **/controlador/accion/ID** existe, sino es así ejecuta la función show_error() mostrando un mensaje amigable al usuario.

public function ver()
{
   if ($this->uri->segment(3) === FALSE)
      show_error ( 'No has especificado un identificador de libro.' );
   $id = (int)$this->uri->segment(3);
...
}

Si accedemos a la url /libros/, CodeIgniter nos debería mostrar un mensaje error amigable.

Veamos ahora un ejemplo donde se realiza una combinación entre excepciones y funciones de error de CodeIgniter:

public function ver()
{
  try {
    if ($this->uri->segment(3) === FALSE)
      throw new Exception(
         'No has especificado un identificador de libro.');
     ....
   }
   catch (Exception $e) {
      show_error($e->getMessage());
   }
}

Dentro del controlador **libros** tenemos una acción **ver()** donde se comprueba si el segmento 3 de la uri **/controlador/accion/ID** existe. Si no es así lanzamos una excepción y dentro de la misma mostramos un error amigable al usuario.

La tercera función, **log_message()**, también es muy interesante. Nos permite guardar mensajes en el fichero de log indicando el tipo: debug, error o info. Puede que necesitemos desarrollar nuestro registro de errores, quizás porque no tengamos acceso al fichero de log del servidor web Apache de nuestro proveedor de servicios de Internet. En primer lugar, necesitaremos configurar los permisos para asegurarnos de que la carpeta **/application/logs** tenga permisos de escritura. Posteriormente, ajustaremos el nivel de log en el archivo de configuración **config.php** dando valor al atributo '**log_threshold**' :

/*
| Error Logging Threshold
|
| If you have enabled error logging, you can set an error threshold    to
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 4;

Estableciendo el nivel 4 a la directiva **log_threshold** mostraríamos todos los mensaje que genera CodeIgniter. Aunque modifiquemos el fichero **index.php** para que no se muestren mensajes de error por pantalla o la directiva **display_error** esté a off, esto no detiene el nivel de log establecido en el fichero **config.php**. Esto es interesante para cuando desplegamos nuestra aplicación en producción, ya que, no mostramos mensajes de error de PHP pero sí podríamos buscar qué ha ocurrido en nuestra aplicación en caso de error.

Destacar que CodeIgniter genera un nuevo registro cada día, y escribe en el mismo según el nivel de log indicado en el fichero **config.php**. Estos ficheros de log pueden ocupar mucho espacio según la actividad de nuestra aplicación.

En la siguiente figura podemos ver un ejemplo.

Ejemplo del fichero de log

Y así durante unas 1000 líneas más, en un día donde se ha producido un uso bastante limitado.

Lo normal es activar el máximo nivel de log a 4 mientras estamos desarrollando la aplicación e incluso cuando realizamos alguna entrega al cliente en preproducción. Conforme la aplicación pasa a un versión más o menos estable o se decide pasarla a producción, el nivel de error recomendado sería el 1, ya que, sólo almacenaría los mensajes de error y los mensajes de error de PHP.

results matching ""

    No results matching ""