Los errores son una parte integral de cada lenguaje de programación, a pesar de que la mayoría de las veces, los programadores prefieren no tener que lidiar con ellos.
PHP tiene excelentes facilidades para manejar errores que proporcionan un excelente nivel de control sobre cómo se generan errores, como manejarlos y reportearlos.
PHP5 introduce manejo de errores por medio de objetos, por esta ocasión solo veremos el manejo de errores en programación estructurada.
Niveles de errores
Compile-time errors | Errores detectados por el analizador mientras esta compilando el script. No puede ser atrapado dentro del propio script |
Fatal errors | Errores que “cuelgan” la ejecución de un script. No pueden ser atrapados |
Recoverable errors | Errores que representan fallas significativas,pero que pueden ser manejados de manera segura |
Warnings | Errores recuperables que indican una falla en tiempo de ejecución. No detienen la ejecución del script. |
Notice | Indican que se produjo una condición de error, pero no es necesariamente importante. No detienen la ejecución del script. |
Como se puede ver, no siempre es posible para un script detectar un fallo y recuperarse de el.
Exceptuando los errores fatales y de compilación, tu script puede por lo menos tener en cuenta que hay un fallo, dandote la posibilidad de manejarlo.
Existen varias directivas de configuración en el archivo php.ini (en linux: /etc/php5/apache2/) que permiten ajustar cómo y qué errores se reportan. Las directivas más importantes son:
error_reporting, display_errors y log_errors
Reporte de errores
La directiva error_reporting determina que niveles de errores son reportados por PHP. La tabla de los niveles de error la pude encontrar aquí
1 |
error_reporting=E_ALL & ~E_NOTICE |
Error reporting también puede se cambiado dinámicamente a través de un script por medio de la función error_reporting()
La función error_reporting(); es la encargada de establecer el nivel de errores que será mostrado, siendo el 0 el nivel en el que ningún error es mostrado al usuario. Existen distintos tipos de variables que pueden indicar el nivel de errores y que por tanto pueden ser pasados como argumento a dicha función. Los puedes ver en la siguiente tabla, con links al manual oficial de PHP.
VALOR | CONSTANTE |
---|---|
1 | E_ERROR |
2 | E_WARNING |
4 | E_PARSE |
8 | E_NOTICE |
16 | E_CORE_ERROR |
32 | E_CORE_WARNING |
64 | E_COMPILE_ERROR |
128 | E_COMPILE_WARNING |
256 | E_USER_ERROR |
512 | E_USER_WARNING |
1024 | E_USER_NOTICE |
2047 | E_ALL |
2048 | E_STRICT |
Mostrar errores
Los directivas display_errors y log_errors se pueden utilizar para determinar cómo se informará de los errores. Si display_errors está encendido, los errores se generan a la salida del script, generalmente hablando, esto no es deseable en un entorno de producción, ya que todo el mundo será capaz de ver los errores de los scripts. En esas circunstancias, en su lugar se desea activar log_errors, lo que hace que los errores se escriban en el registro de errores del servidor web.
Manejando los errores
Los scripts deben ser capaces de recuperarse de un error incluso si es sólo para avisar al usuario de que ha ocurrido un error.
El manejo de errores en PHP es muy fácil. Se puede declarar un función para atrapar los errores la cual será llamada por PHP cuando se produce un error al llamar al set_error_handler()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
// función de gestión de errores function miGestorDeErrores($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { // Este código de error no está incluido en error_reporting return; } switch ($errno) { case E_USER_ERROR: echo "<strong>Mi ERROR</b> [$errno] $errstr<br />\n"; echo " Error fatal en la línea $errline en el archivo $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Abortando...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<strong>Mi WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<strong>Mi NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Tipo de error desconocido: [$errno] $errstr<br />\n"; break; } /* No ejecutar el gestor de errores interno de PHP */ return true; } // establecer el gestor de errores definido por el usuario $gestor_errores_antiguo = set_error_handler("miGestorDeErrores"); // función para probar el manejo de errores function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) para x <= 0 no está definido, usó: scale = $scale", E_USER_ERROR); } if (!is_array($vect)) { trigger_error("Vector de entrada incorrecto, se esperaba una matriz de valores", E_USER_WARNING); return null; } $temp = array(); foreach($vect as $pos => $valor) { if (!is_numeric($valor)) { trigger_error("El valor en la posición $pos no es un número, usando 0 (cero)", E_USER_NOTICE); $valor = 0; } $temp[$pos] = log($scale) * $valor; } return $temp; } // provocar algunos errores, primero definimos una matriz mixta con un elemento no numérico echo "vector a\n"; $a = array(2, 3, "foo", 5.5, 43.3, 21.11); print_r($a); // ahora generamos una segunda matriz echo "----\nvector b - a notice (b = log(PI) * a)\n"; /* Value at position $pos is not a number, using 0 (zero) */ $b = scale_by_log($a, M_PI); print_r($b); // esto es un problema, pasamos una cadena en vez de una matriz echo "----\nvector c - a warning\n"; /* Vector de entrada incorrecto, se esperaba una matriz de valores */ $c = scale_by_log("no array", 2.3); var_dump($c); // NULL // esto es un error crítico, log de cero o de un número negativo es indefinido echo "----\nvector d - fatal error\n"; /* log(x) para x <= 0 no está definido, usó: scale = $scale */ $d = scale_by_log($a, -2.5); var_dump($d); // Nunca se alcanza |
¿Te gustó este artículo?
Si te gustó este artículo, te ha servido o aprendiste algo nuevo; compártelo en tus redes sociales o invítame un cafe.