martes, 10 de marzo de 2009

Transformar errores y warnings de PHP en excepciones

Hoy estuve probando la funcionalidad de envío de email de PHP y como tenía el servidor de mail mal configurado en el PHP.INI, mi aplicación me mostraba un WARNING. El problema es que el WARNING no se tira como una excepción, o sea que no se le puede hacer TRY/CATCH, por lo tanto tuve que buscar como hacer para que estas WARNINGS se pudieran atrapar como cualquier excepción, el resultado es el siguiente:

En PHP existe una función llamada set_error_handler, la cual me permite establecer una función mía para manejar los errores de PHP (PHP tiene distintos tipos de errores y puedo definir distintos manejadores para cada tipo de error).

Entonces, para que todos los errores de PHP (incluyendo WARNINGS) sean enviados a mi manejador (para arrojar una excepción en su lugar) es implementado con el siguiente código:

set_error_handler("my_warning_handler", E_ALL);

function my_warning_handler($errno, $errstr, $errfile, $errline, $errcontext) {
throw new Exception( $errstr );
}

Seleccionando E_ALL, cualquier tipo de error es enviado a mi función para arrojar una excepción.

Los distintos tipos de errores que tiene PHP son:
  • E_ALL
  • E_WARNING
  • E_ERROR
  • E_PARSE
  • E_CORE_ERROR
  • E_CORE_WARNING
  • E_COMPILE_ERROR
  • E_COMPILE_WARNING
  • E_STRICT
Por más información sobre set_error_handler y manejo de errores en PHP:

Espero que les sirva.

3 comentarios:

  1. hola llevo dias buscando una solucion como capturar el warning y enviar otro mensaje o otra accion y no entiendo como pudo hacer correr si me pudieras ayudar.}}te lo agradesco

    ResponderEliminar
  2. La pregunta no se entiende muy bien, te respondo según lo que entiendo:

    La función de arriba permite capturar el warning y lanzar una excepción. Capturando la excepción puedes procesarla y llamar a una función o método de alguna clase. Si deseas capturar el warning en un controller de Yupp, para enviar el mensaje de la excepción a otra acción de un controller, debes utilizar el método redirect() de YuppController: https://code.google.com/p/yupp/source/browse/trunk/YuppPHPFramework/core/mvc/core.mvc.YuppController.class.php

    Un ejemplo de redirect: return $this->redirect(array('action'=>'displayPageRO', 'params'=>array('pageId'=>1)));

    Código del ejemplo: https://code.google.com/p/yupp-cms/source/browse/trunk/yupp-cms/controllers/apps.cms2.controllers.CmsController.class.php

    Saludos.

    ResponderEliminar
  3. Gracias me sirvió de mucho tu ayuda, era justo lo que necesitaba.

    ResponderEliminar