Cattura tutte le eccezioni non gestite da javascript


112

Sto cercando di trovare o trovare un modo per visualizzare in una finestra di avviso tutte le eccezioni JavaScript non gestite in un'applicazione. Vorrei che tutto questo fosse fatto sul lato client, senza utilizzare alcun codice lato server. Sto usando MVC3 come ambiente.

Ho fatto ricerche negli ultimi giorni e non ho trovato esattamente quello che stavo cercando.

Ho trovato 2 modi di seguito che sembrano quasi quello che sto cercando, tranne che questi modi sono impostati in modo che devi passare un nome di funzione in un metodo personalizzato per stampare la traccia dello stack di tutte le eccezioni non gestite all'interno di quello funzione specifica. Sto cercando un modo per non dover passare manualmente un nome di funzione a un metodo personalizzato che stampa la traccia dello stack di tutte le eccezioni non gestite. Vorrei che questi metodi personalizzati "ascoltassero" solo tutte le eccezioni non gestite all'interno dell'intera applicazione.

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

Anche qualcosa di simile al collegamento precedente:

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

Ecco il codice di base dal 2 ° collegamento sopra che stampa la traccia dello stack di una funzione javascript specificata:

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;
}

Quindi, per riassumere, conoscete tutti un modo per avere una sorta di "ascoltatore" per ascoltare tutte le eccezioni non gestite da javascript e poi stamparle sullo schermo in una finestra di avviso?

Grazie! Jason


una cosa ... perché useresti una casella di avviso?!? potresti usare console.log (error_message) per ...
Mathlight

1
Penso che questa domanda Cogli tutti gli errori JS ti aiuterà
Pilgerstorfer Franz

Probabilmente dovresti dare un'occhiata a questa domanda: stackoverflow.com/questions/205688/…
Mark

Risposte:


129

Puoi farlo usando il metodo window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
Molto meglio che cercare di racchiudere la mia intera app in un blocco try / catch. :) Grazie!
Anthony

15
Solo un avvertimento: "Nota che alcuni / molti eventi di errore non attivano window.onerror, devi ascoltarli specificamente." - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
non è necessario includere il nome della funzione (myErrorHandler) in quel codice ... può essere solo funzione (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan è meglio avere il nome della funzione, per scopi di debug. Il debugger utilizzerà il nome della funzione invece di mostrarlo come funzione anonima.
Jerinaw

Questo è fantastico e grazie! ho provato a eseguire il debug di uno script complesso di zoom fotografico che funziona bene il 100% delle volte, tranne su dispositivi mobili safai dove fallisce casualmente e dove non c'è una finestra "console" o "sviluppatore" per vedere cosa è successo. Certo ho la mia finestra di "debug" che posso attivare con un pulsante segreto, ma non avevo modo di vedere globalmente ogni errore che non avevo fatto un "try / catch on". Questa aggiunta mi ha mostrato ESATTAMENTE dov'era il problema e mi ha risparmiato di strappare più capelli! Vorrei poter votare due volte!
Randy

48

Puoi usare window.onerroro (sorprendentemente!) Legarti correttamente all'evento "errore":

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;
})

Se desideri monitorare gli errori JavaScript, puoi provare Atatus . Lavoro in Atatus.


7
perché "restituisci false" dichiarazioni?
kumaresan_sd

@kumaresan_sd consente al gestore di eventi predefinito di attivarsi: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal

29

Inoltre

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;
})

Puoi anche intercettare tutti gli errori generati all'interno di una promessa callback ( .then()) in ascolto di un unhandledrejectionevento

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
È necessario utilizzare sia window.onerrore window.addEventListener("error"o è sufficiente utilizzarne uno?
Tormod Haugene

2
Puoi usarne uno. Se usi window.addEventListener("error", invia il useCaptureset a trueper rilevare anche gli errori degli elementi che non si sono verificati. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez

1
Grazie!! L' errorevento non ha rilevato il mio errore particolare. unhandledrejectioncapito però.
Joe il

throw new Error('tja');non è catturato nell'ultimo cromo con questo approccio ...
OZZIE

1
@JavierPerez Ho provato usando la v80 attaccato all'evento e subito dopo ha generato un errore e non è stato rilevato, né ha rilevato errori di sintassi.
OZZIE,

1

Controlla http://log4javascript.org , è basato su Log4J. Se la maggior parte del codice è racchiusa in istruzioni try / catch per gestire le eccezioni, è possibile utilizzare questa libreria come interfaccia comune per inviare l'output a una "finestra di dialogo" o una finestra di registrazione sempre disponibile che l'utente finale potrebbe vedere. Potresti anche avere un pulsante che esegue un window.print () per stampare il contenuto della finestra di dialogo sulla stampante o sul PDF. In bocca al lupo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.