El hecho de que no se me ocurra cómo hacer esto me hace pensar que es una especie de antipatrón, o imposible. Si alguien tiene alguna idea mejor de cómo manejar mi situación, las recomendaciones siempre son bienvenidas.
Tengo una base de código heredada y en un momento estoy recuperando referencias de función y llamando a la función. Se espera que estas llamadas a funciones devuelvan un resultado, pero a veces les falta su instrucción de retorno. Actualmente, lanzo un error si el valor devuelto es nulo, pero esto solo me da un seguimiento de pila a la ubicación del motor que está llamando a la función, no a la función en sí.
¿Hay alguna manera de que pueda determinar el nombre/número de archivo de la función, o forzar a la función a que arroje un error de modo que se genere un seguimiento de pila de esa función real?
No existe tal característica en el lenguaje Javascript. No es anti-patrón, simplemente no es algo que el lenguaje admita. No es necesario que una función tenga una declaración de return
y no hay forma de obligarla a lanzar una excepción si no devuelve un valor.
Sin ver ninguno de los códigos relevantes, puedo ofrecer algunas sugerencias:
Establezca un punto de interrupción en la línea de su código que inicia la llamada a la función. Luego, rastree la función en el depurador. Puede profundizar tanto como necesite y cada vez que acceda a una nueva llamada de función, le mostrará el archivo y el número de línea en el que se encuentra. Uso esta técnica regularmente cuando estoy confundido por algún comportamiento de algún módulo (ya sea integrado en nodejs o un módulo externo que estoy usando) y no está claro de inmediato cómo encontrar el código correcto en Github para ello. Simplemente entro y puedo ver el código de inmediato y verlo ejecutarse línea por línea según sea necesario para cualquier problema que esté investigando.
Suponiendo que esta función a la que está llamando espera algunos argumentos, puede darle algún tipo de argumentos falsos que, con suerte, activarían algún tipo de excepción y luego podría ver el seguimiento de la pila de esa excepción. Por ejemplo, si esperaba un objeto no opcional como argumento, podría pasar null
y ver si eso desencadena una excepción. Si esperaba una devolución de llamada, podría pasar una no función y ver si eso provocó una excepción.
En cuanto al nombre de la función, si la función tiene un nombre real (no es anónimo) y fn
es la referencia de su función, entonces puede hacer console.log(fn.name)
y ver si hay un nombre. También puede examinar fn.toString()
y ver si revela el código fuente de la función. A veces lo hará y si la función es una función con nombre que puede mostrarle su nombre. Esto no le mostrará en qué archivo está, pero tal vez podría buscar algo que vea en la fuente para encontrarlo.
Aquí hay un ejemplo del punto #3:
function hello() { return "hi"; } // create function reference that points to my function const fn = hello; // log info on that function reference console.log(fn.name); console.log(fn.toString());