Abfangen aller nicht behandelten Javascript-Ausnahmen

112

Ich versuche, eine Möglichkeit zu finden oder herauszufinden, wie alle nicht behandelten Javascript-Ausnahmen in einer Anwendung in einem Warnfeld angezeigt werden können. Ich möchte, dass dies alles auf der Clientseite erfolgt, ohne dass serverseitiger Code verwendet wird. Ich verwende MVC3 als Umgebung.

Ich habe in den letzten Tagen recherchiert und nicht genau das gefunden, wonach ich suche.

Ich habe unten zwei Möglichkeiten gefunden, die fast das sind, wonach ich suche, außer dass diese Möglichkeiten so eingerichtet sind, dass Sie einen Funktionsnamen an eine benutzerdefinierte Methode übergeben müssen, um die Stapelverfolgung aller nicht behandelten Ausnahmen innerhalb dieser zu drucken spezifische Funktion. Ich suche nach einer Möglichkeit, einen Funktionsnamen nicht manuell an eine benutzerdefinierte Methode übergeben zu müssen, die den Stack-Trace aller nicht behandelten Ausnahmen druckt. Ich möchte, dass diese benutzerdefinierte Methode nur auf alle nicht behandelten Ausnahmen in der gesamten Anwendung wartet.

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

Auch etwas ähnliches wie der vorherige Link:

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

Hier ist der Basiscode aus dem zweiten Link oben, der den Stack-Trace einer angegebenen Javascript-Funktion druckt:

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

Also, um das zusammenzufassen, kennen Sie alle eine Möglichkeit, eine Art "Listener" zu haben, der auf alle nicht behandelten Ausnahmen von Javascript wartet und sie dann in einem Warnfeld auf den Bildschirm druckt?

Vielen Dank! Jason

jre247
quelle
eins ... warum würdest du eine Alarmbox benutzen?!? Sie könnten console.log (error_message) verwenden, um ....
Mathlight
1
Ich denke, diese Frage Alle JS-Fehler abfangen wird Ihnen helfen
Pilgerstorfer Franz
Sie sollten wahrscheinlich einen Blick auf diese Frage: stackoverflow.com/questions/205688/...
Mark

Antworten:

129

Sie können dies mithilfe der window.onerror-Methode tun.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}
Nish
quelle
13
Viel besser als zu versuchen, meine gesamte App in einen Try / Catch-Block zu packen. :) Vielen Dank!
Anthony
15
Nur ein Hinweis: "Beachten Sie, dass einige / viele Fehlerereignisse kein window.onerror auslösen. Sie müssen speziell darauf achten." - developer.mozilla.org/en-US/docs/Web/API/…
Shusson
6
Es ist nicht erforderlich, den Funktionsnamen (myErrorHandler) in diesen Code aufzunehmen ... kann nur eine Funktion sein (errorMsg, url, lineNumber)
JoelFan
18
@JoelFan Für Debugging-Zwecke ist es besser, den Funktionsnamen zu haben. Der Debugger verwendet den Funktionsnamen, anstatt ihn als anonyme Funktion anzuzeigen.
Jerinaw
Das ist großartig und danke! Ich habe versucht, ein komplexes Skript zum Zoomen von Fotos zu debuggen, das 100% der Zeit einwandfrei funktioniert, außer auf mobilen Safai, bei denen es zufällig fehlschlägt und bei denen es kein "Konsolen" - oder "Entwickler" -Fenster gibt, um zu sehen, was passiert ist. Sicher, ich habe mein eigenes "Debug" -Fenster, das ich mit einem geheimen Knopf einschalten kann, aber ich hatte keine Möglichkeit, jeden Fehler, den ich nicht ausprobiert / gefangen hatte, global zu sehen. Dieser Zusatz zeigte mir GENAU, wo das Problem lag, und ersparte mir das Herausreißen von mehr Haaren! Ich wünschte, ich könnte dies zweimal abstimmen!
Randy
48

Sie können window.onerrordas Ereignis 'error' entweder verwenden oder (erstaunlicherweise!) Richtig binden:

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

Wenn Sie JavaScript-Fehler verfolgen möchten, können Sie Atatus ausprobieren . Ich arbeite bei Atatus.

Fizer Khan
quelle
7
Warum geben Sie "return false" an?
Kumaresan_sd
@kumaresan_sd erlaubt es dem Standard-Event-Handler zu feuern: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal
29

Zusätzlich zu

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

Sie können auch alle Fehler abfangen, die in einem versprochenen Rückruf ( .then()) ausgelöst wurden, der auf ein unhandledrejectionEreignis wartet

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})
Javier Perez
quelle
1
Ist es notwendig , beide zu verwenden window.onerrorund window.addEventListener("error", oder unter Verwendung einer von ihnen ausreichend?
Tormod Haugene
2
Sie können einen von ihnen verwenden. Wenn Sie verwenden window.addEventListener("error", senden Sie useCaptureset to true, um auch Elementfehler zu erfassen, die nicht in die Luft gesprudelt sind. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez
1
Danke dir!! Das errorEreignis hat meinen speziellen Fehler nicht erfasst. unhandledrejectionhabe es aber verstanden.
Joe
throw new Error('tja');wird bei diesem Ansatz nicht im neuesten Chrom gefangen ...
OZZIE
1
@JavierPerez Ich habe mit v80 getestet, das Ereignis erreicht und direkt danach einen Fehler ausgegeben, der nicht abgefangen wurde und auch keine Syntaxfehler abfing.
OZZIE
1

Schauen Sie sich http://log4javascript.org an, es basiert auf Log4J. Wenn der größte Teil Ihres Codes in try / catch-Anweisungen eingeschlossen ist, um Ausnahmen zu behandeln, können Sie diese Bibliothek als allgemeine Schnittstelle zum Senden von Ausgaben an ein immer verfügbares "Dialogfeld" oder Protokollierungsfenster verwenden, das Ihr Endbenutzer sehen kann. Sie könnten sogar eine Schaltfläche haben, die eine window.print () ausführt, um den Inhalt des Dialogfelds auf dem Drucker oder als PDF zu drucken. Viel Glück.

Robert Bolton
quelle