throw "AArrggg"
Wie kann ich den Stack-Trace abrufen (in Firebug oder auf andere Weise), wenn ich selbst eine JavaScript-Ausnahme auslöse (z. B. )? Im Moment bekomme ich nur die Nachricht.
Bearbeiten : Wie viele unten stehende Personen gepostet haben, ist es möglich, einen Stack-Trace für eine JavaScript-Ausnahme abzurufen, aber ich möchte einen Stack-Trace für meine Ausnahmen abrufen. Zum Beispiel:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Wenn foo
aufgerufen wird, möchte ich ein Stack - Trace erhalten , die , um die Anrufe umfasst foo
, bar
, bar
.
javascript
stack-trace
David Wolever
quelle
quelle
throw 'arrrgh';
, und sie scheinen dieselben zu sein wie beithrow new Error('arrrgh');
. Der Chrome-Debugger muss jedochthrow new Error('arrrgh');
wie angegeben noch verwendet werden (Chrome scheint jedoch viel detailliertere Spuren zu liefern).Antworten:
Edit 2 (2017):
In allen modernen Browsern können Sie einfach anrufen:
console.trace();
(MDN-Referenz)Edit 1 (2013):
Eine bessere (und einfachere) Lösung, wie in den Kommentaren zur ursprünglichen Frage ausgeführt, besteht darin, die
stack
Eigenschaft einesError
Objekts wie folgt zu verwenden :Dies erzeugt eine Ausgabe wie folgt:
Geben Sie den Namen der aufrufenden Funktion zusammen mit der URL, ihrer aufrufenden Funktion usw. an.
Original (2009):
Eine modifizierte Version dieses Snippets kann etwas helfen:
quelle
caller
jetzt veraltet ist undcallee
aus dem strengen ES5-Modus entfernt wird. Hier ist, warum stackoverflow.com/questions/103598/…Beachten Sie, dass Chrom / Chrom (andere Browser, die V8 verwenden) und auch Firefox über eine praktische Oberfläche verfügen, über die eine Stacktrace über eine Stack- Eigenschaft für Fehlerobjekte abgerufen werden kann.
Dies gilt sowohl für die Basisausnahmen als auch für die, die Sie selbst werfen. (Es wird davon ausgegangen, dass Sie die Fehlerklasse verwenden, was ohnehin eine gute Vorgehensweise ist.)
Weitere Informationen finden Sie in der V8-Dokumentation
quelle
.stack
Eigenschaft auch.console.error(e.stack);
so dass es wie eine Standardausnahmemeldung aussiehtIn Firefox müssen Sie die Ausnahme anscheinend nicht auslösen. Es ist ausreichend zu tun
quelle
window.onerror
wird. Es zeigt einen fast leeren Stapel mit nur deronerror
Funktion.console.log(new Error().stack)
> :(> :(> :(Wenn Sie einen Firebug haben, wird die Option für alle Fehler auf der Registerkarte "Skript" unterbrochen. Sobald das Skript Ihren Haltepunkt erreicht hat, können Sie das Stapelfenster von firebug anzeigen:
quelle
Eine gute (und einfache) Lösung, wie in den Kommentaren zur ursprünglichen Frage ausgeführt, besteht darin, die
stack
Eigenschaft einesError
Objekts wie folgt zu verwenden :Dies erzeugt eine Ausgabe wie folgt:
Geben Sie den Namen der aufrufenden Funktion zusammen mit der URL und der Zeilennummer, ihrer aufrufenden Funktion usw. an.
Ich habe eine wirklich ausgefeilte und hübsche Lösung, die ich für ein Projekt entwickelt habe, an dem ich gerade arbeite, und ich habe sie extrahiert und ein wenig überarbeitet, um sie zu verallgemeinern. Hier ist es:
Schau es dir auf GitHub an (derzeit v1.2)! Sie können es wie
Console.debug("Whatever");
folgt verwenden und es wird abhängig von den Einstellungen inConsole
die Ausgabe und einen Stack-Trace drucken (oder einfach nur Infos / gar nichts extra). Hier ist ein Beispiel:Stellen Sie sicher, dass Sie mit den Einstellungen im
Console
Objekt herumspielen! Sie können einen Abstand zwischen den Linien der Ablaufverfolgung hinzufügen und diese vollständig deaktivieren. Hier ist es mitConsole.trace
gesetzt auffalse
:Sie können sogar das erste Bit info gezeigt (Satz deaktivieren
Console.settings.debug.showInfo
zufalse
) oder deaktivieren Sie das Debuggen vollständig (SatzConsole.settings.debug.enabled
auffalse
) , so dass Sie nie wieder eine Debug - Anweisung kommentieren Sie müssen! Lass sie einfach drin und das bringt nichts.quelle
Ich glaube nicht, dass irgendetwas eingebaut ist, das Sie verwenden können, aber ich habe viele Beispiele von Leuten gefunden, die ihre eigenen rollen.
quelle
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Sie können auf die
stack
(stacktrace
in Opera) Eigenschaften einerError
Instanz zugreifen, auch wenn Sie sie geworfen haben. Die Sache ist, Sie müssen sicherstellen, dass Sie verwendenthrow new Error(string)
(vergessen Sie nicht das neue stattthrow string
.Beispiel:
quelle
Mit dem Chrome-Browser können Sie die folgende
console.trace
Methode verwenden: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectquelle
Dies gibt eine Stapelverfolgung (als Array von Zeichenfolgen) für modernes Chrome, Opera, Firefox und IE10 +
Verwendungszweck:
Es schließt den eigenen Aufruf sowie den Titel "Fehler", der von Chrome und Firefox (aber nicht vom IE) verwendet wird, vom Stapel aus.
Es sollte nicht in älteren Browsern abstürzen, sondern nur ein leeres Array zurückgeben. Wenn Sie eine universellere Lösung benötigen, schauen Sie sich stacktrace.js an . Die Liste der unterstützten Browser ist wirklich beeindruckend, aber meiner Meinung nach ist sie sehr groß für die kleine Aufgabe, für die sie bestimmt ist: 37 KB minimierter Text einschließlich aller Abhängigkeiten.
quelle
Ein Update zu Eugenes Antwort: Das Fehlerobjekt muss ausgelöst werden, damit der IE (bestimmte Versionen?) Die
stack
Eigenschaft füllen kann. Das Folgende sollte besser funktionieren als sein aktuelles Beispiel und eine Rückkehrundefined
im IE vermeiden .Hinweis 1: Diese Art von Dingen sollte nur beim Debuggen ausgeführt und im Live-Modus deaktiviert werden, insbesondere wenn sie häufig aufgerufen werden. Hinweis 2: Dies funktioniert möglicherweise nicht in allen Browsern, scheint jedoch in FF und IE 11 zu funktionieren, was meinen Anforderungen entspricht.
quelle
Eine Möglichkeit, einen echten Stack-Trace für Firebug zu erhalten, besteht darin, einen echten Fehler wie das Aufrufen einer undefinierten Funktion zu erstellen:
Oder verwenden Sie
console.error()
gefolgt von einerthrow
Anweisung, daconsole.error()
die Stapelverfolgung angezeigt wird.quelle
Dieser Polyfill-Code funktioniert in modernen (2017) Browsern (IE11, Opera, Chrome, FireFox, Yandex):
Andere Antwort:
funktioniert nicht in IE 11!
Mit arguments.callee.caller - arbeitet nicht im Strict - Modus in jedem Browser!
quelle
In Google Chrome (Version 19.0 und höher) funktioniert das Auslösen einer Ausnahme einwandfrei. Zum Beispiel:
zeigt den Stack-Trace an der Konsolenausgabe des Browsers an:
Ich hoffe das hilft.
quelle
Funktion:
Anwendungsfall:
quelle
Dieses Skript zeigt den Fehler an
quelle
quelle
Etwas spät zur Party, aber hier ist eine andere Lösung, die automatisch erkennt ob argument.callee verfügbar ist, und wenn nicht, den neuen Error (). Stack verwendet. Getestet in Chrom, Safari und Firefox.
2 Varianten - stackFN (n) gibt Ihnen den Namen der Funktion n vom unmittelbaren Aufrufer entfernt und stackArray () gibt Ihnen ein Array, wobei stackArray () [0] der unmittelbare Aufrufer ist.
Probieren Sie es unter http://jsfiddle.net/qcP9y/6/ aus.
quelle
Sie können diese Bibliothek verwenden http://www.stacktracejs.com/ . Es ist sehr gut
Aus der Dokumentation
quelle
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
ist eine alte Version, die neueste stabile Version (passend zum Code-Snippet) ist hier:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Hier ist eine Antwort, die Ihnen maximale Leistung (IE 6+) und maximale Kompatibilität bietet. Kompatibel mit IE 6!
quelle
Es ist einfacher, in Firefox einen Stack-Trace zu erhalten als in IE. Grundsätzlich möchten Sie jedoch Folgendes tun:
Wickeln Sie den "problematischen" Code in einen Try / Catch-Block ein:
Wenn Sie den Inhalt des "Fehler" -Objekts untersuchen, enthält es die folgenden Felder:
e.fileName: Die Quelldatei / Seite, von der das Problem stammt. e.lineNumber: Die Zeilennummer in der Datei / Seite, auf der das Problem aufgetreten ist. e.message: Eine einfache Nachricht, die beschreibt, welche Art von Fehler aufgetreten ist. e.name: Der Typ Der Fehler, der aufgetreten ist, sollte im obigen Beispiel 'TypeError' sein. e.stack: Enthält den Stack-Trace, der die Ausnahme verursacht hat
Ich hoffe das hilft dir weiter.
quelle
Ich musste eine endlose Rekursion in smartgwt mit IE11 untersuchen. Um tiefer zu untersuchen, brauchte ich eine Stapelverfolgung. Das Problem war, dass ich die Entwicklungskonsole nicht verwenden konnte, da die Reproduktion auf diese Weise schwieriger war.
Verwenden Sie in einer Javascript-Methode Folgendes:
quelle
Wow - ich sehe seit 6 Jahren keine einzige Person, die vorschlägt, dass wir zuerst prüfen, ob
stack
verfügbar ist, bevor sie verwenden! Das Schlimmste, was Sie in einem Fehlerbehandler tun können, ist, einen Fehler auszulösen, weil Sie etwas aufrufen, das nicht vorhanden ist.Wie andere bereits gesagt haben,
stack
wird die Verwendung in IE9 oder früheren Versionen nicht unterstützt , obwohl sie derzeit größtenteils sicher ist.Ich protokolliere meine unerwarteten Fehler und eine Stapelverfolgung ist ziemlich wichtig. Für maximale Unterstützung überprüfe ich zuerst, ob
Error.prototype.stack
es eine Funktion gibt. Wenn ja, dann ist es sicher zu verwendenerror.stack
.Bearbeiten: Da
stack
es sich um eine Eigenschaft und nicht um eine Methode handelt, können Sie sie auch in älteren Browsern sicher aufrufen. Ich bin immer noch verwirrt, weil ichError.prototype
mir ziemlich sicher war, dass das Überprüfen für mich früher funktioniert hat und jetzt nicht mehr - also bin ich mir nicht sicher, was los ist.quelle
Wenn Sie
console.error(e.stack)
Firefox verwenden, wird nur die Stapelverfolgung in Protokollen angezeigt. Chrome zeigt auch die Meldung an. Dies kann eine schlechte Überraschung sein, wenn die Nachricht wichtige Informationen enthält. Protokollieren Sie immer beide.quelle
Probiere es einfach
Dies funktioniert ziemlich gut für Chrom:
quelle