2012-02-09 13 views

Respuesta

5

¿Por qué no tener un controlador de errores y filtro por tipo de error en el controlador y llamar a diferentes funciones desde allí? Hacer una GenericErrorHandler() y hacer esto en él:

switch($errno){ 
    case E_USER_ERROR: UserErrorHandler(...); break; 
} 
1

Puede tener un gestor de errores y controlar los errores como este (bueno, es PHP 5.3, pero discúlpeme - ligeras modificaciones y que va a trabajar normalmente)

set_error_handler(function($errno, $errstr, $errfile, $errline) 
{ 
    switch($errno) 
    { 
     case E_ERROR: 
     { 
      # Bla bla bla, your code here 
      return true; 
     } 
    } 

    return false; 
}); 

Si realmente debe usar dos set_error_handler diferentes, puede usar la llamada de función para obtener el controlador de errores anterior. Y aun así, perderás los errores por los que estás filtrando.

Tener un controlador así es mucho más elegante.

+1

Tenga en cuenta que esto supone> ​​= 5.4 PHP – thorne51

3

Entonces, para aferrarnos a lo que dice Westie, la parte importante es que solo puede tener un controlador de errores, y la función set_error_handler() devuelve el controlador de error definido previamente, o nulo si no se definió ninguno. Por lo tanto, en los manejadores de errores, posiblemente use una clase que almacene el controlador de errores anterior al registrarlo, de modo que cuando maneje los errores con su método de clase, llame también al controlador de errores anterior. Un extracto del cliente Raven-php Sentry:

public function registerErrorHandler($call_existing_error_handler = true, $error_types = -1) 
{ 
    $this->error_types = $error_types; 
    $this->old_error_handler = set_error_handler(array($this, 'handleError'), error_reporting()); 
    $this->call_existing_error_handler = $call_existing_error_handler; 
} 

y luego el método de error de identificador:

public function handleError($code, $message, $file = '', $line = 0, $context=array()) 
{ 
    if ($this->error_types & $code & error_reporting()) { 
     $e = new ErrorException($message, 0, $code, $file, $line); 
     $this->handleException($e, true, $context); 
    } 

    if ($this->call_existing_error_handler && $this->old_error_handler) { 
     call_user_func($this->old_error_handler, $code, $message, $file, $line, $context); 
    } 
} 
Cuestiones relacionadas