2009-02-17 18 views
15

Estoy desarrollando un código de extremo inferior en mi sistema que usa múltiples clases secundarias de la clase de excepción php. Básicamente, tengo las excepciones divididas en algunas categorías. Lo que quiero hacer son dos cosas.Excepciones en PHP - Prueba/captura o set_exception_handler?

  1. Necesito todas las excepciones que se disparan en la aplicación para ser manejadas en un solo lugar.
  2. Necesito poder registrar y luego manejar/generar la vista para que el usuario reciba comentarios sobre las aplicaciones. error.

Lo que me pregunto es si debería tener algún tipo de try/catch encapsulando la aplicación? No me gusta esa idea en absoluto, suena como una implementación muy mala. Tampoco me gusta la idea de set_exception_handler a menos que pueda configurar la función para que sea un método de un objeto. La razón de esto es que si designo una función para manejar las excepciones, esta será la primera función en la aplicación. Todo lo demás es un método de un objeto.

Espero haber proporcionado suficientes detalles sobre el escenario. Estoy tratando de mantener esto limpio y seguir las mejores prácticas. Este código se va OSS así que no tengo ganas de escribir 10 veces :)

+2

No se relaciona con la pregunta, solo indica que PHP tiene algunas excepciones secundarias predefinidas. Ver http://www.php.net/~helly/php/ext/spl/classException.html – Mario

Respuesta

23
  1. Ejecutar sus peticiones web a través de una llamada set_exception_handlerFront Controller script
  2. temprano en ejecución (no se olvide de dar cuenta de error_reporting()) set_exception_handler toma como parámetro lo que php llama "callback". Puede pasar un método de objeto, así:

    // $object->methodName() will be called on errors 
    set_exception_handler(array($object, 'methodName')); 
    
  3. envolver su código de repartición dotado try/catch para recoger el código que hace lanzar excepciones. La parte de captura de su código capturará todas las excepciones de sus propios códigos, más algunos errores de php que no generaron una excepción de forma nativa (por ejemplo, fopen o algo similar), gracias a su llamada set_exception_handler anterior. El manual de PHP:

    los siguientes tipos de errores no pueden ser manejados con una función definida por el usuario: E_ERROR, E_PARSE, E_CORE_ERROR E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, y la mayoría de E_STRICT criados en el archivo donde se llama a set_error_handler().

  4. errores de registro según sea necesario.

  5. Cree una plantilla de página de error (la "Vista") que opera en un objeto Exception (el "Modelo") y imprime bastante todo el rastro de la pila en desarrollo. Crea una plantilla diferente que vaya a producción. Ramificarse en su entorno, por ejemplo:

    catch(Exception $e) { 
        // log error as necessary here. 
        if("in developement") { 
         // $e would be available to your template at this point 
         include "errortemplates/dev.php"; 
        } else { 
         include "errortemplates/prod.php"; 
        } 
    } 
    
+0

Muchas gracias esta va a ser la ruta que tomaré. – Syntax

3

De la forma en que suena, usted va a utilizar set_exception_handler. Esto garantizará que todas las excepciones se manejen de la misma manera. Hay lugares para usar los bloques de prueba/captura en su aplicación, por ejemplo, si desea verificar una excepción única que no necesariamente deba atraparse de la misma manera.

En cuanto a establecer set_exception_handler, no estoy seguro de si puede establecer la función como un método de un objeto a menos que sea un método estático. Parece que es el caso. Hay más información en http://us2.php.net/set_exception_handler

11

Hay más información específica acerca de las "devoluciones de llamada" de PHP here. Para utilizar un método estático, la devolución de llamada es algo así como

<?php 
set_exception_handler(array('MyClass','staticMethod')); 
?> 

utilizar un método de una instancia de objeto, que es:

<?php 
set_exception_handler(array($myObject, 'objectMethod')); 
?> 

Y para usar una función global, es simplemente:

<?php 
set_exception_handler('my_global_function'); 
?> 
Cuestiones relacionadas