Wie Eldar anmerkt, können Sie e.message
verwenden, um die Nachricht der Ausnahme zu erhalten. Allerdings können Sie in Chrome, Firefox und IE10+ auch den Stack-Trace mit e.stack
abrufen. Der Stack-Trace wird die Datei und Zeilennummer der Ausnahme enthalten.
Also, um einen String mit Ausnahmeinformationen zusammenzustellen, würden Sie etwas Ähnliches wie dies schreiben:
var exmsg = "";
if (e.message) {
exmsg += e.message;
}
if (e.stack) {
exmsg += ' | stack: ' + e.stack;
}
Beachten Sie, dass Sie nur einen Stack-Trace erhalten, wenn
- die Ausnahme vom Browser geworfen wurde (z.B. als Reaktion auf einen Syntaxfehler);
- das Ausnahmeobjekt ein Error-Objekt ist oder das Error-Objekt als Prototyp hat.
Also, einfach nur einen String zu werfen (throw 'Ausnahme!!') wird Ihnen keinen Stack-Trace geben.
Um dies etwas weiter zu führen, um alle unbehandelten Ausnahmen abzufangen, würden Sie einen window.onerror-Handler verwenden (ähnlich dem .Net Application_Error-Handler in global.asax). Der Nachteil war früher (und ist größtenteils immer noch), dass Ihnen dadurch kein Zugriff auf das tatsächliche Ausnahmeobjekt gegeben wurde, sodass Sie den Stack-Trace nicht erhalten konnten. Sie bekamen nur die Nachricht, URL und Zeilennummer.
In letzter Zeit wurde der Standard erweitert, um Ihnen auch die Spalte (großartig für minifizierte Dateien) und das Ausnahmeobjekt zu geben: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent
Aktuell (April 2014) implementiert nur Chrome 32 all dies. IE10+ gibt Ihnen die Spalte, aber nicht das Ausnahmeobjekt. Firefox 28 gibt immer noch nur die Nachricht, URL und Zeilennummer zurück. Hoffentlich wird sich das bald verbessern. Ich habe darüber für das JSNLog-Projekt geschrieben, unter: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging
(Haftungsausschluss: Ich bin der Autor von JSNLog und jsnlog.com)
Zweitens unterstützt das .Net Exception-Objekt innere Ausnahmen. Es hat auch eine Daten-Eigenschaft, sodass Sie Schlüssel-Wert-Paare mit z. B. Variablenwerten anhängen können. So etwas habe ich im JavaScript-Fehlerobjekt vermisst, also habe ich mein eigenes Exception-Objekt erstellt, auch als Teil des JSNLog-Projekts. Es befindet sich in der jsnlog.js-Datei im jsnlog.js-GitHub-Projekt (https://github.com/mperdeck/jsnlog.js).
Die Beschreibung finden Sie unter: http://jsnlog.com/Documentation/JSNLogJs/Exception
Zu guter Letzt eine schamlose Eigenwerbung - das JSNLog-Projekt, an dem ich arbeite, ermöglicht es Ihnen, Logger in Ihrem JavaScript einzufügen und die Protokollnachrichten automatisch in Ihr vorhandenes serverseitiges Protokoll einzufügen. Um JavaScript-Ausnahmen mit ihren Stack-Traces in Ihr serverseitiges Protokoll zu protokollieren, müssen Sie nur Folgendes schreiben:
try {
...
} catch (e) {
JL().fatalException("Etwas ist schief gelaufen!", e);
}