Publi

Encontrar y ordenar códigos de error desperdigados por el código

En mi caso, es un proyecto relativamente grande, y como todo proyecto grande, empieza con buen pie, hay cosas que gusta programarlas más que otras y a veces da mucha pereza hacer determinadas cosas… como el control de errores. ¿ Alguna vez dije que esto es importante ? Sí lo es, pero es de las cosas que más pereza da hacer. Y es que en este mundo todo puede fallar.

En mi proyecto, los errores los he ido comprobando, y generando una excepción en muchos de ellos. A las excepciones, además, se les asigna un código. Como habrá varios grupos de usuarios que accederán a ello, en algunas ocasiones esos grupos podrán ver sólo el código del error, el cual me dirán a mí y ya veré yo (o un administrador con más nivel) lo que pasa.

Bueno, el caso es que llega el momento en que cuando generas una excepción, quieres darle un valor diferente a otro error, tal vez que los números sean correlativos, y a veces no te acuerdas por qué error vas contando y, como me pasa a mi, empiezo a contar desde 999 en adelante, cuando me vuelvo a perder 9999, y llega un momento que no sabes cuántos 9 llevas y tienes que hacer limpieza.

Un ejemplo de excepción es:

1
throw new \TragicException(_d('core', "Can't load objects of type $type."), 30);

Pues este script me ayudó mucho a recopilar todos los errores y mostrarlos de forma ordenada para ver cómo tengo que continuar:

1
$ egrep -Rn 'TragicException' * | sed 's/\(.*\) \([0-9]\+\));$/\2 \1 \2);/g' | sort -n

En este caso uso:

  • egrep para hacer una búsqueda de TragicException dentro de todos los archivos de mi proyecto (*). Además:
    • -R hace una búsqueda recursiva (entra en todos los directorios para seguir buscando)
    • -n Muestra también los números de línea
  • sed lo utilizo para hacer una sustitución dentro del texto. Al tratarse de una ejecución dentro de bash, necesitamos escapar algunos caracteres como (, ), +… En este caso la sustución es ‘s/origen/destino/g’
    • origen: \(.*\) \([0-9]\+\));$ : Selecciona cualquier cosa (.*), luego hay un espacio y le sigue un número ([0-9]+), paréntesis cerrado, punto y coma y termina la línea ($)
    • destino: \2 \1 \2); : usaremos \n para poner el elemento número n entre paréntesis dentro de origen. Con \2 ponemos el número que capturamos y con \1 ese «cualquier cosa» del principio
  • sort lo uso para ordenar los resultados especificando con -n que será un ordenado numérico

Devolviendo algo como esto:


9 lib/app.class.php:120: throw new \TragicException(_d(‘core’, «Don’t know what role it is: %s», $role), 9);
9 lib/app.class.php:83: throw new \TragicException(_d(‘core’, «Don’t know what role it is: %s», $role), 9);
48 lib/cache.class.php:41: throw new \TragicException(_d(‘core’, ‘Cache engine %s not found’, $engine), 48);
48 lib/cache.class.php:93: throw new \TragicException(_d(‘core’, ‘Cache engine not specified’), 48);
999 lib/utils/basis.php:249: throw new \TragicException(_d(‘core’, «Given callback: %s is not valid», print_rline($callback)), 999);
9999 lib/utils/basis.php:323: throw new \TragicException(_d(‘core’, ‘getOptions has no type’), 9999);
12039 lib/utils/basis.php:302: throw new \TragicException(_d(‘core’, «Given model: %s is not valid», print_rline($callback)), 12039);
12383 lib/utils/basis.php:327: throw new \TragicException(_d(‘core’, ‘getOptions for type %s has no value’, $type), 12383);
99999 lib/app.class.php:65: throw new \TragicException(_d(‘core’, «Deprecated»), 99999);
99999 lib/app.class.php:69: throw new \TragicException(_d(‘core’, «Deprecated»), 99999);
99999 lib/app.class.php:73: throw new \TragicException(_d(‘core’, «Deprecated»), 99999);

Al menos, ya sé las líneas que tengo que cambiar, y puedo crearme aparte un listado de errores como documentación adicional de mi proyecto.

Leave a Reply