Tengo un pequeño editor JS incrustado en mi sitio y cuando el código que contiene arroja un error, me gustaría subrayar dónde está ocurriendo el error. El seguimiento de la pila de errores se ve así:
err ReferenceError: a is not defined at isNumber (eval at handle_message (about:srcdoc:11:7), <anonymous>:5:5) at Array.filter (<anonymous>) at removeNumbers (eval at handle_message (about:srcdoc:11:7), <anonymous>:13:15) at eval (eval at handle_message (about:srcdoc:11:7), <anonymous>:16:28) at handle_message (about:srcdoc:14:7) En este caso, mi solución deseada devolvería { line: 5, column: 5 } (la primera entrada del seguimiento de la pila)
Mi primer instinto es simplemente hacer un análisis de texto + expresiones regulares para obtener los últimos 2 números de la segunda línea. Sin embargo, esto parece una solución muy poco confiable, y no estoy seguro de si los seguimientos de pila seguirán este formato para todos los tipos de errores y en todos los navegadores.
¿Existe una forma más confiable de extraer la ubicación del error de un objeto de Error de JavaScript?
Hay una forma integrada de obtener el número de línea y columna en JavaScript, pero desafortunadamente, no es compatible (literalmente) con todos los navegadores. El único navegador que lo soporta es Firefox.
En este momento, lo mejor que puede hacer es obtenerlo desde la consola del navegador.
Sin embargo, para obtenerlo del objeto Error , primero puede envolver su código en una instrucción try / catch .
try { a(); } catch (err) { console.log(err); // ReferenceError: a is... }Luego, puede obtener los números de línea y columna de él. Tener cuidado; ¡Solo es compatible con Mozilla!
console.log(err.lineNumber, err.columnNumber); // 5 5 Las únicas propiedades que no son estándar en el objeto Error son el nombre y el mensaje.
En conclusión, aunque existe una forma integrada de obtener el número de línea y columna en JavaScript, no es estándar y solo es compatible con Firefox .
La mejor manera de obtenerlo es obtenerlo desde la consola del navegador (o obtenerlo de bibliotecas de terceros, si es posible).