inicio fin etiquetas asp php error-handling

fin - Manejo de errores en PHP



php</ php (9)

Estoy familiarizado con algunos de los conceptos básicos, pero me gustaría saber más sobre cuándo y por qué se debe usar el manejo de errores (incluido el lanzamiento de excepciones) en PHP, especialmente en un sitio en vivo o una aplicación web. ¿Es algo que se puede usar en exceso y, de ser así, cómo se ve el uso excesivo? ¿Hay casos en que no debería usarse? Además, ¿cuáles son algunas de las preocupaciones de seguridad comunes en relación con el manejo de errores?


Además de manejar errores de inmediato en tu código, también puedes hacer uso de

http://us.php.net/manual/en/function.set-exception-handler.php
y
http://us.php.net/manual/en/function.set-error-handler.php

Me parece particularmente útil configurar su propio manejador de excepciones. Cuando ocurre una excepción, puede realizar diferentes operaciones dependiendo del tipo de excepción que sea.

por ejemplo: cuando una llamada mysql_connet devuelve FALSE , lanzo una new DBConnectionException(mysql_error()) y la manejo de una manera "especial": registro el error, la información de conexión DB (host, nombre de usuario, contraseña) etc. y tal vez envíe un correo electrónico al equipo de desarrollo notificándoles que algo puede estar realmente mal con el DB

Lo uso para complementar el manejo de errores estándar. No recomendaría abusar de este enfoque


En lugar de generar mysql_error, puede almacenarlo en un registro. De esta forma puede rastrear el error (y no depende de que los usuarios lo denuncien) y puede ingresar y eliminar el problema.

El mejor manejo de errores es del tipo transparente para el usuario, deje que su código resuelva el problema, sin necesidad de involucrar a ese usuario.


La mejor práctica en mi humilde opinión es utilizar el siguiente enfoque: 1. crear un controlador de error / excepción 2. iniciarlo en el inicio de la aplicación 3. manejar todos sus errores desde adentro

<?php

clase Debug {

public static setAsErrorHandler() { set_error_handler(array(__CLASS__, ''__error_handler'')); } public static function __error_handler($errcode, $errmsg, $errfile, $errline) { if (IN DEV) { print on screen } else if (IN PRO) { log and mail } }

}

Debug :: setAsErrorHandler ();

?>


Los errores no manuales detienen el script, solo eso es una buena razón para manejarlos.

En general, puede usar un bloque Try-Catch para tratar los errores

try { // Code that may error } catch (Exception $e) { // Do other stuff if there''s an error }

Si desea detener el error o mensaje de advertencia que aparece en la página, puede prefijar la llamada con un signo @ como ese.

@mysql_query($query);

Sin embargo, con las consultas, generalmente es una buena idea hacer algo como esto para tener una mejor idea de lo que está sucediendo.

@mysql_query($query) or die(''Invalid query: '' . mysql_error() . ''<br />Line: '' . __LINE__ . ''<br />File: '' . __FILE__ . ''<br /><br />'');


En términos generales, los errores son un legado en PHP, mientras que las excepciones son la forma moderna de tratar los errores. Lo más simple, entonces, es configurar un controlador de errores que arroje una excepción. De esta forma, todos los errores se convierten en excepciones, y luego puede tratar simplemente con un esquema de manejo de errores. El siguiente código convertirá los errores en excepciones para usted:

function exceptions_error_handler($severity, $message, $filename, $lineno) { if (error_reporting() == 0) { return; } if (error_reporting() & $severity) { throw new ErrorException($message, 0, $severity, $filename, $lineno); } } set_error_handler(''exceptions_error_handler''); error_reporting(E_ALL ^ E_STRICT);

Sin embargo, hay algunos casos en que el código está específicamente diseñado para funcionar con errores. Por ejemplo, el método schemaValidate de DomDocument genera advertencias al validar un documento. Si convierte errores en excepciones, dejará de validarse después de la primera falla. Algunas veces esto es lo que desea, pero al validar un documento, es posible que realmente desee todas las fallas. En este caso, puede instalar temporalmente un controlador de errores, que recopila los errores. Aquí hay un pequeño fragmento, lo he usado para ese propósito:

class errorhandler_LoggingCaller { protected $errors = array(); function call($callback, $arguments = array()) { set_error_handler(array($this, "onError")); $orig_error_reporting = error_reporting(E_ALL); try { $result = call_user_func_array($callback, $arguments); } catch (Exception $ex) { restore_error_handler(); error_reporting($orig_error_reporting); throw $ex; } restore_error_handler(); error_reporting($orig_error_reporting); return $result; } function onError($severity, $message, $file = null, $line = null) { $this->errors[] = $message; } function getErrors() { return $this->errors; } function hasErrors() { return count($this->errors) > 0; } }

Y un caso de uso:

$doc = new DomDocument(); $doc->load($xml_filename); $validation = new errorhandler_LoggingCaller(); $validation->call( array($doc, ''schemaValidate''), array($xsd_filename)); if ($validation->hasErrors()) { var_dump($validation->getErrors()); }


La supresión de errores con @ es muy lenta.


Una cosa para agregar a lo que ya se dijo es que es fundamental que registre cualquier error en su aplicación web en un registro. De esta forma, como lo sugiere Jeff "Coding Horror" Atwood, sabrá cuándo sus usuarios tienen problemas con su aplicación (en lugar de "preguntarles qué ocurre").

Para hacer esto, recomiendo el siguiente tipo de infraestructura:

  • Cree una tabla de "bloqueo" en su base de datos y un conjunto de clases contenedoras para informar errores. Recomiendo establecer categorías para los bloqueos ("bloqueo", "seguridad", "error / advertencia PHP" (frente a excepción), etc.).
  • En todos los códigos de manejo de errores, asegúrese de registrar el error. Hacer esto consistentemente depende de qué tan bien construiste la API (paso anterior) - debería ser trivial registrar bloqueos si se hace bien.

Crédito adicional: a veces, sus fallas serán bloqueos a nivel de base de datos: ej. Servidor de bases de datos inactivo, etc. Si ese es el caso, su infraestructura de registro de errores (arriba) fallará (no puede registrar el bloqueo en el DB porque el log intenta para escribir en el DB). En ese caso, escribiría la lógica de failover en su clase de contenedor Crash para

  • envíe un correo electrónico al administrador, Y / O
  • registrar los detalles del bloqueo en un archivo de texto sin formato

Todo esto suena como una exageración, pero créanme, esto hace una diferencia en si su aplicación es aceptada como "estable" o "escamosa". Esa diferencia proviene del hecho de que todas las aplicaciones comienzan como escamosas / bloqueadas todo el tiempo, pero los desarrolladores que conocen todos los problemas con sus aplicaciones tienen la oportunidad de arreglarlo realmente.


También puede usar Formularios de Google para capturar y analizar excepciones, sin tener que mantener una base de datos o un servidor de acceso público. Hay un tutorial aquí que explica el proceso.


Debe usar el Manejo de errores en los casos en que no tenga control explícito sobre los datos en los que está trabajando su script. Tiendo a usarlo con frecuencia, por ejemplo, en lugares como la validación de formularios. Saber cómo detectar los lugares propensos a errores en el código requiere cierta práctica: algunos más comunes son después de llamadas a funciones que devuelven un valor o cuando se trata de resultados de una consulta de base de datos. Nunca debe suponer que el retorno de una función será lo que espera, y debe asegurarse de programar con anticipación. No tiene que usar bloques try / catch, aunque son útiles. Muchas veces se puede salir adelante con un simple control de if / else.

El manejo de errores va de la mano con las prácticas de codificación segura, ya que hay una gran cantidad de "errores" que no causan que la secuencia de comandos simplemente se bloquee. aunque no se trata estrictamente del manejo de errores per se, addbytes tiene una buena serie de 4 artículos sobre algunos de los aspectos básicos de la programación segura de PHP que puede encontrar AQUÍ . Hay muchas otras preguntas aquí en sobre temas como mysql_real_escape_string y expresiones regulares que pueden ser muy útiles para confirmar el contenido de los datos ingresados ​​por el usuario.