2009-07-03 31 views
5

Gracias a todos por adelantado.Manejo de errores de PHP

Actualmente estoy en el proceso de retocar/mejorar un marco MVC que escribí desde el principio para mi empresa. Es relativamente nuevo, por lo que es ciertamente incompleto. Necesito incorporar el manejo de errores en el marco (todo debería tener acceso al manejo de errores) y debería ser capaz de manejar diferentes tipos y niveles de errores (errores de usuario y errores de Marco). Mi pregunta es ¿cuál es la mejor manera y el mejor mecanismo para hacer esto? Conozco el manejo de excepciones de PHP 5 y el mecanismo de error diferente de PEAR, pero nunca he usado ninguno de ellos. Necesito algo eficiente y fácil de usar.

¿Sería mejor crear mi propio manejo de errores o usar algo ya hecho? Cualquier sugerencia, consejos, preguntas son bienvenidos. En última instancia, creo que es dulzura registrar de alguna manera el controlador de errores con PHP, por lo que solo tendría que arrojar el error y luego decidir qué hacer con él y si continuar.

EDITAR: Disculpa, debería haber proporcionado más detalles sobre qué tipo de errores quería iniciar sesión. Estoy buscando registrar 2 tipos principales de errores: Usuario y Marco.

Para los errores del usuario, me refiero a direcciones incorrectas (404), acceso ilegal a páginas restringidas, etc. Sé que podría volver a dirigirme a la página de inicio o simplemente soltar un cuadro de diálogo de JavaScript, pero quiero ser capaz de manejar elegently estos errores y agregar más errores de usuario a medida que se vuelven evidentes.

Por errores Framework que significa cosas como no pueden conectarse a la base de datos, alguien ha eliminado una tabla de base de datos sobre accidentes o elimina un archivo de alguna manera, etc.

Además, voy a cuidar de desarrollo y el manejo directo del servidor.

+0

no es una respuesta, pero no se olvide de manejar dev/production environements :) – marcgg

Respuesta

5

yo creo que en última instancia, la dulzura para registrar de alguna manera el gestor de errores con PHP para que yo sólo tiene que tirar el error y luego decidir qué hacer con él y si se debe continuar.

Puede hacer exactamente eso, con set_error_handler() y set_exception_handler().

No hay una "sola manera correcta" de manejar el error, pero aquí hay algunas cosas a considerar.

  • trigger_error() es similar a arrojar nueva Excepción en que ambos escapará de la ejecución actual de inmediato, sólo se trigger_error() no es capturable.
  • ¿Cómo desea que se manejen los errores en un entorno de desarrollo (mostrar en pantalla?) Versus en un entorno de producción (registrado y enviado por correo electrónico)
  • Puede usar las funciones anteriores para esencialmente "convertir" errores en excepciones o viceversa versa
  • No todos los tipos de error pueden ser manipulados con un manipulador de error personalizado
+0

Gracias, no sabía acerca de esas funciones. En caso de errores en el servidor de desarrollo, simplemente apareceré en la pantalla (o en la consola Firebug) y registraré/enviaré correos electrónicos al servidor en vivo según el tipo y nivel de error. –

+0

Probablemente uniré esto con algunas clases de excepciones personalizadas. –

5

Aquí hay algunas cosas que suelo hacer:

  • utilizar un ajuste de configuración global o una bandera para cambiar entre desa trabajo y producción.
  • No utilice los errores de PHP cuando se tiene una elección: Prefiero excepciones para su propio handeling error.Si está utilizando una biblioteca que no usa excepciones, detecte los errores y presente sus propias excepciones.
  • Utilice un receptor de excepción de nivel superior que muestre excepciones de forma que sea fácil de leer. Si coloca este try-catch-block estratégicamente, no tiene que registrar un manejador de excepción global.
  • siempre se desarrollan con error_handeling(E_ALL | E_STRICT)
  • advertencias y avisos de captura de PHP utilizando set_error_handler() y ejecución alto. Esto elimina una gran cantidad de errores de antemano, con un código muy sólido como resultado.
  • El código de error global debe ser muy ligero, para evitar errores. Siempre existe el riesgo de recurrencia cuando se trata con controladores de errores globales.
  • Si el sistema está en modo de producción, no muestre ningún detalle: registre el error y genere un identificador único al que el usuario puede hacer referencia si desea presentar un error o informar el error.
+1

Gracias por los consejos. Nunca pensé usar set_error_handler() así durante el desarrollo, tiene sentido. –

2

Al trabajar en un sitio más grande, es mejor tener una idea del historial de errores, especialmente cuando las cosas pueden fácilmente caer en caminos lógicos involuntarios cuando un probador o un usuario desencadena un caso de uso extraño.

Tiendo a construir en try catch bloques que son capaces de registrar el error y detener la ejecución en el caso de algo fatal (y escupir una página de error con el código de error), o en el caso de error, continuar, pero anotarlo en mis registros de errores. En su mayoría terminan construyendo un controlador de error personalizado, ya que de lo contrario hay demasiados matices a medida que aumenta la escala.

Durante el desarrollo, utilizo el generador de perfiles PHP de Particletree para registrar errores y otros datos relevantes en una consola con la traza, el mensaje y la línea. Es lindo, no puedo hablar de su eficiencia. Puede inflar el código, pero ¡oh, Dios mío !, puede ser un salvavidas tener una comprensión de texto sin formato de dónde y cómo ocurrieron los errores. Especialmente útil cuando se trata de cosas como servicios web SOAP que arrojarán excepciones para usted como el negocio de nadie.

También me parece útil abstraer un registro de depuración y mantenerlo global, de manera que, como se ha dicho antes, cuando se cambia a producción, no se escupirá todo tipo de ropa sucia al aire frío de Internet. , ya que puede cambiar con relativa facilidad la salida del depurador a una base de datos sql, o correo electrónico, o lo que sea.

perfiles de Particletree: http://particletree.com/features/php-quick-profiler/

+0

He usado la clase de registro de PEAR antes, y una cosa que me gusta es que puede manejar muchos mecanismos de registro diferentes (correo electrónico, base de datos, archivo, consola, etc.). Estoy pensando en usar eso para registrar errores en el lugar correcto. –

0

Antes de entrar en directo pongo a prueba mi proyecto completo en las etapas clave durante el desarrollo, comprobación de mis registros de errores (utilizo panel de control Plesk) para realizar un seguimiento de los errores de PHP.

Cuando un proyecto está activo, en etapas clave de una clase o aplicación, envío un informe de errores o depuración usando una clase que construí. Envía el informe de errores a una dirección de correo electrónico definida con información clave como: fecha y hora, usuario, página de referencia, URL completa y una breve nota que defino al activar/llamar a la clase de depuración.

Solía ​​forzarlo a escribir un archivo de registro, pero me pareció inseguro, ya que el directorio tenía que tener un chmod de 777, y no era eficiente ya que tenía que acceder a los registros más recientes cada vez. Enviándome un correo electrónico, resuelvo el problema de inmediato.

+0

Gracias, me gustaría construirlo para que pueda iniciar sesión en un tipo de error/nivel base. Algunos errores simplemente se registran, otros se registran y al usuario se le muestra una página de error, y otros el usuario obtiene una página de error y el error se registra y se envía un correo electrónico. –