Captura de todas las excepciones no controladas de JavaScript

112

Estoy tratando de encontrar o descubrir una manera de mostrar en un cuadro de alerta todas las excepciones de JavaScript no controladas en una aplicación. Me gustaría que todo esto se hiciera en el lado del cliente, sin usar ningún código del lado del servidor. Estoy usando MVC3 como entorno.

He estado investigando durante los últimos días y no he encontrado exactamente lo que estoy buscando.

Encontré 2 formas a continuación que parecen ser casi lo que estoy buscando, excepto que estas formas están configuradas para que tenga que pasar un nombre de función a un método personalizado para imprimir el seguimiento de la pila de todas las excepciones no controladas dentro de ese función específica. Estoy buscando una forma de no tener que pasar manualmente un nombre de función a un método personalizado que imprime el seguimiento de la pila de todas las excepciones no controladas. Me gustaría que este método personalizado simplemente 'escuche' todas las excepciones no controladas dentro de toda la aplicación.

http://eriwen.com/javascript/js-stack-trace/

También algo similar al enlace anterior:

https://github.com/eriwen/javascript-stacktrace

Aquí está el código básico del segundo enlace anterior que imprime el seguimiento de la pila de una función javascript especificada:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Entonces, para resumir esto, ¿todos conocen alguna forma de tener algún tipo de 'oyente' para escuchar todas las excepciones no controladas de JavaScript y luego imprimirlas en la pantalla en un cuadro de alerta?

¡Gracias! Jason

jre247
fuente
una cosa ... ¿por qué usarías un cuadro de alerta? podría usar console.log (error_message) para ....
Mathlight
1
Creo que esta pregunta Detectar todos los errores de JS te ayudará
Pilgerstorfer Franz
Probablemente debería echar un vistazo a esta pregunta: stackoverflow.com/questions/205688/…
Mark

Respuestas:

129

Puede hacer esto usando el método window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}
Nish
fuente
13
Mucho mejor que tratar de envolver toda mi aplicación en un bloque try / catch. :) ¡Gracias!
Anthony
15
Solo un aviso: "Tenga en cuenta que algunos / muchos eventos de error no activan window.onerror, debe escucharlos específicamente". - developer.mozilla.org/en-US/docs/Web/API/…
shusson
6
no es necesario incluir el nombre de la función (myErrorHandler) en ese código ... solo puede ser function (errorMsg, url, lineNumber)
JoelFan
18
@JoelFan es mejor tener el nombre de la función, para fines de depuración. El depurador usará el nombre de la función en lugar de mostrarse como una función anónima.
Jerinaw
¡Esto es genial y gracias! He intentado depurar un script complejo de zoom de fotos que funciona bien el 100% del tiempo, excepto en safai móvil donde falla aleatoriamente y donde no hay una ventana de "consola" o "desarrollador" para ver qué sucedió. Seguro que tengo mi propia ventana de "depuración" que puedo activar con un botón secreto, pero no tenía forma de ver globalmente todos los errores que no había hecho en un "intento / captura". Esta adición me mostró EXACTAMENTE dónde estaba el problema, ¡y evitó que me arrancara más cabello! ¡Ojalá pudiera votar esto dos veces!
Randy
48

Puede usar window.onerror, o (¡asombrosamente!) Enlazarse al evento 'error' correctamente:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Si desea realizar un seguimiento de los errores de JavaScript, puede probar Atatus . Trabajo en Atatus.

Fizer Khan
fuente
7
¿Por qué estás "devuelve una declaración falsa"?
kumaresan_sd
@kumaresan_sd permite que se active el controlador de eventos predeterminado: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal
29

Además de

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

También puede detectar todos los errores disparados dentro de una promesa de devolución de llamada ( .then()) escuchando el unhandledrejectionevento

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})
Javier Pérez
fuente
1
¿Es necesario utilizar ambos window.onerrory window.addEventListener("error", o basta con utilizar uno de ellos?
Tormod Haugene
2
Puedes usar uno de ellos. Si usa window.addEventListener("error", envíe el useCaptureconjunto a truepara detectar también los errores de elementos que no aparecieron. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez
1
¡¡Gracias!! El errorevento no captó mi error particular. unhandledrejectionaunque lo tengo.
Joe
throw new Error('tja');no está atrapado en el último cromo con este enfoque ...
OZZIE
1
@JavierPerez Probé usando v80 adjunto el evento y arrojé un error directamente después y no fue detectado, tampoco detecté errores de sintaxis.
OZZIE
1

Consulte http://log4javascript.org , está basado en Log4J. Si la mayor parte de su código está envuelto en declaraciones try / catch para manejar excepciones, puede hacer uso de esta biblioteca como una interfaz común para enviar resultados a un "cuadro de diálogo" o ventana de registro siempre disponible que su usuario final pueda ver. Incluso podría tener un botón que realiza un window.print () para imprimir el contenido del cuadro de diálogo en la impresora o PDF. Buena suerte.

Robert Bolton
fuente