Si lanzo una excepción de JavaScript yo mismo (por ejemplo, throw "AArrggg"
), ¿cómo puedo obtener el seguimiento de la pila (en Firebug o de otro modo)? En este momento acabo de recibir el mensaje.
editar : como han publicado muchas personas a continuación, es posible obtener un seguimiento de la pila para una excepción de JavaScript, pero quiero obtener un seguimiento de la pila para mis excepciones. Por ejemplo:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Cuando foo
se llama, quiero conseguir un seguimiento de pila que incluye las llamadas a foo
, bar
, bar
.
javascript
stack-trace
David Wolever
fuente
fuente
throw 'arrrgh';
, y parecen lo mismo que conthrow new Error('arrrgh');
.throw new Error('arrrgh');
Sin embargo, el depurador de Chrome todavía necesita lo dicho (pero Chrome parece dar rastros mucho más detallados).Respuestas:
Edición 2 (2017):
En todos los navegadores modernos, simplemente puede llamar:
console.trace();
(Referencia de MDN)Edición 1 (2013):
Una solución mejor (y más simple) como se señala en los comentarios sobre la pregunta original es usar la
stack
propiedad de unError
objeto de esta manera:Esto generará resultados como este:
Dar el nombre de la función de llamada junto con la URL, su función de llamada, etc.
Original (2009):
Una versión modificada de este fragmento puede ayudar un poco:
fuente
caller
ahora está en desuso ycallee
se elimina del modo estricto ES5. He aquí por qué stackoverflow.com/questions/103598/…Tenga en cuenta que el cromo / cromo (otros navegadores que usan V8) y también Firefox tienen una interfaz conveniente para obtener un seguimiento de la pila a través de una propiedad de la pila en los objetos de error .
Se aplica a las excepciones básicas, así como a las que arrojes tú mismo. (Consideró que usa la clase Error, que de todos modos es una buena práctica).
Ver detalles en la documentación de V8
fuente
.stack
propiedad.console.error(e.stack);
para que parezca un mensaje de excepción predeterminadoEn Firefox parece que no necesitas lanzar la excepción. Es suficiente para hacer
fuente
window.onerror
, muestra una pila casi vacía con solo laonerror
función.console.log(new Error().stack)
> :(> :(> :(Si tiene Firebug, hay una opción de interrupción en todos los errores en la pestaña de secuencia de comandos. Una vez que el script ha alcanzado su punto de ruptura, puede mirar la ventana de la pila de Firebug:
fuente
Una buena (y simple) solución como se señala en los comentarios sobre la pregunta original es usar la
stack
propiedad de unError
objeto de esta manera:Esto generará resultados como este:
Dar el nombre de la función de llamada junto con la URL y el número de línea, su función de llamada, etc.
Tengo una solución realmente elaborada y bonita que he ideado para un proyecto en el que estoy trabajando actualmente y la he extraído y reelaborado un poco para generalizarla. Aquí está:
¡Compruébalo en GitHub (actualmente v1.2)! Puede usarlo como
Console.debug("Whatever");
y, según la configuraciónConsole
, imprimirá el resultado y un seguimiento de la pila (o simplemente información simple / nada extra). Aquí hay un ejemplo:¡Asegúrate de jugar con la configuración del
Console
objeto! Puede agregar espacio entre las líneas de la traza y desactivarlo por completo. Aquí está con elConsole.trace
conjunto parafalse
:Incluso puede desactivar el primer bit de información que se muestra (establecer
Console.settings.debug.showInfo
enfalse
) o deshabilitar la depuración por completo (establecerConsole.settings.debug.enabled
enfalse
) para que nunca tenga que volver a comentar una declaración de depuración. Solo déjelos adentro y esto no hará nada.fuente
No creo que haya nada incorporado que pueda usar, sin embargo, encontré muchos ejemplos de personas rodando por su cuenta.
fuente
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Puede acceder a las propiedades
stack
(stacktrace
en Opera) de unaError
instancia incluso si la arrojó. La cuestión es que debe asegurarse de usarthrow new Error(string)
(no olvide lo nuevo en lugar de)throw string
.Ejemplo:
fuente
Con el navegador Chrome, puede usar el
console.trace
método: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectfuente
Esto dará un seguimiento de la pila (como una matriz de cadenas) para Chrome, Opera, Firefox e IE10 + modernos
Uso:
Excluye de la pila su propia llamada, así como el título "Error" que utilizan Chrome y Firefox (pero no IE).
No debería bloquearse en los navegadores más antiguos, sino simplemente devolver una matriz vacía. Si necesita una solución más universal, consulte stacktrace.js . Su lista de navegadores compatibles es realmente impresionante, pero en mi opinión es muy grande para esa pequeña tarea a la que está destinada: 37 KB de texto minimizado, incluidas todas las dependencias.
fuente
Una actualización de la respuesta de Eugene: el objeto de error debe ser lanzado para que IE (¿versiones específicas?) Llene la
stack
propiedad. Lo siguiente debería funcionar mejor que su ejemplo actual, y debería evitar regresarundefined
cuando esté en IE.Nota 1: Este tipo de cosas solo se deben hacer al depurar y deshabilitarlas cuando está activo, especialmente si se llama con frecuencia. Nota 2: Esto puede no funcionar en todos los navegadores, pero parece funcionar en FF e IE 11, lo que se adapta perfectamente a mis necesidades.
fuente
Una forma de obtener un seguimiento real de la pila en Firebug es crear un error real como llamar a una función indefinida:
O use
console.error()
seguido de unathrow
declaración ya queconsole.error()
muestra el seguimiento de la pila.fuente
Este código polyfill funciona en navegadores modernos (2017) (IE11, Opera, Chrome, FireFox, Yandex):
Otras respuestas:
no funciona en IE 11!
Utilizando argumentos.callee.caller : ¡no funciona en modo estricto en ningún navegador!
fuente
En Google Chrome (versión 19.0 y posteriores), simplemente lanzar una excepción funciona perfectamente. Por ejemplo:
mostrará el seguimiento de la pila en la salida de la consola del navegador:
Espero que esto ayude.
fuente
función:
caso de uso:
fuente
este script mostrará el error
fuente
fuente
Un poco tarde para la fiesta, pero, aquí hay otra solución, que detecta automáticamente si argumentos.callee está disponible, y usa el nuevo Error (). Stack si no. Probado en Chrome, Safari y Firefox.
2 variantes: stackFN (n) le da el nombre de la función n lejos del llamador inmediato, y stackArray () le da una matriz, siendo stackArray () [0] el llamador inmediato.
Pruébelo en http://jsfiddle.net/qcP9y/6/
fuente
Puede usar esta biblioteca http://www.stacktracejs.com/ . Es muy bueno
De la documentación
fuente
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
es una versión antigua, la versión estable más nueva (que coincide con el fragmento de código) está aquí:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Aquí hay una respuesta que le brinda el máximo rendimiento (IE 6+) y la máxima compatibilidad. Compatible con IE 6!
fuente
Es más fácil obtener un seguimiento de la pila en Firefox que en IE, pero fundamentalmente esto es lo que desea hacer:
Envuelva el fragmento de código "problemático" en un bloque try / catch:
Si va a examinar el contenido del objeto "error", contiene los siguientes campos:
e.fileName: el archivo / página de origen del que surgió el problema e.lineNumber: el número de línea en el archivo / página donde surgió el problema e.message: un mensaje simple que describe qué tipo de error ocurrió e.name: el tipo de error que tuvo lugar, en el ejemplo anterior debería ser 'TypeError' e.stack: contiene el seguimiento de la pila que causó la excepción
Espero que esto te ayude.
fuente
Tuve que investigar una recursión sin fin en smartgwt con IE11, por lo que para investigar más a fondo, necesitaba un seguimiento de la pila. El problema era que no podía usar la consola de desarrollo, porque la reproducción era más difícil de esa manera.
Use lo siguiente en un método javascript:
fuente
Wow: ¡no veo a una sola persona en 6 años sugiriendo que verifiquemos primero para ver si
stack
está disponible antes de usarlo! Lo peor que puede hacer en un controlador de errores es arrojar un error por llamar a algo que no existe.Como han dicho otros, aunque
stack
es más seguro de usar ahora, no es compatible con IE9 o versiones anteriores.Registro mis errores inesperados y un seguimiento de la pila es bastante esencial. Para obtener el máximo soporte, primero verifico si
Error.prototype.stack
existe y si es una función. Si es así, es seguro de usarerror.stack
.Editar: Parece que, dado que
stack
es una propiedad y no un método, puede llamarlo con seguridad incluso en navegadores antiguos. Todavía estoy confundido porque estaba bastante seguro de que la verificaciónError.prototype
funcionó para mí anteriormente y ahora no lo hace, así que no estoy seguro de lo que está sucediendo.fuente
Usando
console.error(e.stack)
Firefox solo muestra el stacktrace en los registros, Chrome también muestra el mensaje. Esto puede ser una mala sorpresa si el mensaje contiene información vital. Siempre registre ambos.fuente
Sólo inténtalo
Esto funciona bastante bien para Chrome:
fuente