La programación es 50% construir – 50% arreglar. El arte de construir es algo maravilloso y lo que nos produce mayor satisfacción… Por el contrario, arreglar los errores (que nosotros mismos construimos) puede tornarse un trabajo más difícil que programar, puede hacer de tu vida un infierno, hasta el punto en que te haría dudar sobre si elegiste bien tu profesión o debiste ser veterinario (si lo sé, exagero
).
Arreglar errores es todo un tema aparte, pero… ¿Cómo poder arreglar algo que no sabemos por qué se produce, cuando se produce y dónde se produce?
Para eso se inventaron las descripciones de errores (junto con un número de identificación). Aunque algunas veces esas descripciones son tan útiles como un destornillador para zurdos. Es algo que yo llamo “errores ciegos”, errores que no dicen nada, errores que no aportan nada a la resolución y estorban o confunden.
Por ejemplo, errores como los que el Wordpress da:

“Ha ocurrido un error sin identificar.” ¿que rayos ha pasado? Algunos podrían decir que “por lo menos me lo ha dicho en mi idioma”. Pero esta descripción de “sin identificar” no ayuda en nada, y simplemente deja una única opción al usuario: resignarse, y empezar a rezar para que no ocurra de nuevo.
Gracias a una función encontrada en los comentarios de la documentación de PHP, podemos conseguir que los errores mostrados digan algo más que un simple “ha ocurrido un error, jodete!” y así poder cercarlo y solucionarlo
La función en cuestión es la siguiente:
function my_error_handler($errno, $errstr, $errfile, $errline){
$errno = $errno & error_reporting();
if($errno == 0) return;
if(!defined('E_STRICT')) define('E_STRICT', 2048);
if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096);
print "<pre>\n<b>";
switch($errno){
case E_ERROR: print "Error"; break;
case E_WARNING: print "Warning"; break;
case E_PARSE: print "Parse Error"; break;
case E_NOTICE: print "Notice"; break;
case E_CORE_ERROR: print "Core Error"; break;
case E_CORE_WARNING: print "Core Warning"; break;
case E_COMPILE_ERROR: print "Compile Error"; break;
case E_COMPILE_WARNING: print "Compile Warning"; break;
case E_USER_ERROR: print "User Error"; break;
case E_USER_WARNING: print "User Warning"; break;
case E_USER_NOTICE: print "User Notice"; break;
case E_STRICT: print "Strict Notice"; break;
case E_RECOVERABLE_ERROR: print "Recoverable Error"; break;
default: print "Unknown error ($errno)"; break;
}
print ":</b> <i>$errstr</i>\n";
if(function_exists('debug_backtrace')){
//print "backtrace:\n";
$backtrace = debug_backtrace();
array_shift($backtrace);
foreach($backtrace as $i=>$l){
print "[$i] in function <b>{$l['class']}{$l['type']}{$l['function']}</b>";
if($l['file']) print " in <b>{$l['file']}</b>";
if($l['line']) print " on line <b>{$l['line']}</b>";
print "\n";
}
}
print "\n</pre>";
if(isset($GLOBALS['error_fatal'])){
if($GLOBALS['error_fatal'] & $errno) die('fatal');
}
}
function error_fatal($mask = NULL){
if(!is_null($mask)){
$GLOBALS['error_fatal'] = $mask;
}elseif(!isset($GLOBALS['die_on'])){
$GLOBALS['error_fatal'] = 0;
}
return $GLOBALS['error_fatal'];
}
Muy fácil:
set_error_handler('my_error_handler');
set_error_handler se encarga de enviar todos los errores a la función my_error_handler, la cual parsea, formatea e imprime en pantalla los errores.
Veamos la diferencia:
Sin la función de errores:
Fatal error: Un extraño error ha ocurrido. No le daré más información. in C:\AppServ\www\errores\db.php on line 9
Con la función de errores:
User Error: Un extraño error ha ocurrido. No le daré más información. [0] in function trigger_error in C:\AppServ\www\errores\db.php on line 9 [1] in function tierno_y_jugueton in C:\AppServ\www\errores\db.php on line 4 [2] in function dulce_conejito in C:\AppServ\www\errores\index.php on line 8
Los números iniciales, significan el grado de “profundidad” del error. En este ejemplo, trigger_error está dentro de la función tierno_y_jugueton, que a su vez está dentro de la función dulce_conejito, que fué llamada desde index.php en la línea 8.
Puedes descargar el ejemplo y comprobarlo tu mismo!
Realmente esto es muy útil de tener en cuenta para debuguear.
Hola, tengo ese error en mi wordpress y no sé que ocurre.
Trato de añadir un campo personalizado y no me deja, me lo pone en blanco los campos, trato luego de eliminar o actualizar y me sale ese mismo error.
¿Alguien ha encontrado la solución para arreglarlo?
Muchas Gracias