2010-01-15 17 views
11

Tengo una aplicación php que acabo de volver a factorizar. Por desgracia, escupiendo advertencias como:Tratando advertencias como errores

Advertencia: preg_match() espera parámetro 2 sea cuerda, objeto dado en /home/yacoby/dev/netbeans/php/Zend/Db/Select.php en la línea 776

Lo que es imposible (o un trabajo muy difícil) resolver el problema ya que no tengo una pila de llamadas así que no puedo decir qué partes de mi código están causando la advertencia y hay un montón de código.

Necesito un método para tratar advertencias como errores (en el que la aplicación muere e imprime el stacktrace) o necesito que se muestre la pila cuando se imprimen errores. ¿Hay un método para hacer esto?

+2

Xdebug es mi elección. – andyk

+0

La respuesta de XDebug fue aceptada, ya que produjo la mejor stacktrace (además de que tenía enlaces clicables en mi IDE;)). Todos los demás obtuvieron +1 también para buenas respuestas que funcionaron bien. – Yacoby

+1

XDebug habla de una característica de este tipo http://xdebug.org/docs/stack_trace – naivists

Respuesta

4

puede definir su propio gestor de errores utilizando set_error_handler()

En la función de controlador se puede tratar a cada clase de error que le apetezca. Aquí hay una plantilla básica que uso, en mi caso solo quiero manejar errores fatales, por lo que ignoro avisos y advertencias.

En su caso, usted podría hacer una traza sobre las advertencias, o registrarlos como quiera

function error_handler($errno,$message,$file,$line,$context) { 

switch($errno) { 
    // ignore warnings and notices 
    case E_WARNING: 
    case E_NOTICE: 
    case E_USER_NOTICE: 
    case E_USER_WARNING: 
     break; 
    // log PHP and user errors 
    case E_ERROR: 
    case E_USER_ERROR: 
       // Do some processing on fatal errors 
    } 
} 
+1

Los siguientes tipos de error no se pueden manejar 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 parte de E_STRICT aparece en el archivo donde se llama a set_error_handler(). - Pero subí aún más. – Gordon

+0

Ah, gracias por la información. Normalmente lo usé para manejar USER_ERROR pero no era consciente de que no podía atrapar E_ERROR, aunque tiene sentido cuando lo piensas. –

18

Ver ejemplo # 1 en http://www.php.net/manual/en/class.errorexception.php

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 
+0

Eso es genial, nunca pensé en hacerlo de esa manera. –

+0

Creo que así es como PHPUnit lo hace para convertir errores, avisos y advertencias regulares en excepciones de aviso/aviso de PHPUnit Framework. – Gordon

+0

No sé si es "genial", pero definitivamente es lo más fácil. :PAG –

9

un vistazo a set_error_handler() e incluir esto en el comienzo de sus scripts o en su arranque para simplemente imprimir el stacktrace cuando ocurren E_WARNINGs.

function stacktrace_error_handler($errno,$message,$file,$line,$context) 
{ 
    if($errno === E_WARNING) { 
     debug_print_backtrace(); 
    } 
    return false; // to execute the regular error handler 
} 
set_error_handler("stacktrace_error_handler"); 

Para obtener más control sobre los diversos tipos, echar un vistazo a la versión más explícita publicado en otras partes de las respuestas.

Cuestiones relacionadas