660 Stimmen

Wie kann ich einen JavaScript-Stack-Trace erhalten, wenn ich eine Ausnahme auslöse?

Wenn ich selbst eine JavaScript-Ausnahme auslöse (z. B., throw "AArrggg" ), wie kann ich den Stack-Trace (in Firebug oder anders) erhalten? Im Moment bekomme ich nur die Meldung.

bearbeiten : Wie viele der unten genannten Personen gepostet haben, ist es möglich, einen Stack-Trace für eine JavaScript-Ausnahme aber ich möchte einen Stack-Trace für meine Ausnahmen. 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 eine Stapelverfolgung erhalten, die die Aufrufe an foo , bar , bar .

11voto

Mark Biek Punkte 140395

Ich glaube nicht, dass es irgendetwas gibt, das man verwenden kann, aber ich habe viele Beispiele von Leuten gefunden, die ihre eigene Software entwickelt haben.

9voto

sbr Punkte 4419

Mit dem Chrome-Browser können Sie Folgendes verwenden console.trace Methode: https://developer.chrome.com/devtools/docs/console-api#consoletraceobject

9voto

Eli Grey Punkte 34008

Sie können auf die stack ( stacktrace in Opera) Eigenschaften eines Error Instanz, auch wenn du sie geworfen hast. Die Sache ist die, Sie müssen sicherstellen, dass Sie throw new Error(string) (Vergessen Sie nicht die 代わりに throw string .

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}

7voto

Patrick Seymour Punkte 151

Eine Aktualisierung der Antwort von Eugene: Das Fehlerobjekt muss geworfen werden, damit der IE (bestimmte Versionen?) die stack Eigentum. Das folgende Beispiel sollte besser funktionieren als sein aktuelles, und es sollte vermeiden, dass etwas zurückkommt undefined wenn Sie den IE verwenden.

function stackTrace() {
  try {
    var err = new Error();
    throw err;
  } catch (err) {
    return err.stack;
  }
}

Hinweis 1: Diese Art von Dingen sollte nur bei der Fehlersuche durchgeführt werden, und deaktiviert, wenn live, vor allem, wenn häufig aufgerufen. Hinweis 2: Dies kann nicht in allen Browsern funktionieren, aber scheint in FF und IE 11 zu funktionieren, die meine Bedürfnisse gerade gut passt.

7voto

Konstantin Smolyanin Punkte 15905

Dies gibt einen Stack-Trace (als Array von Strings) für moderne Chrome, Opera, Firefox und IE10+

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

使用方法

console.log(getStackTrace().join('\n'));

Es schließt aus dem Stack seinen eigenen Aufruf sowie den Titel "Error" aus, der von Chrome und Firefox (aber nicht IE) verwendet wird.

Es sollte bei älteren Browsern nicht abstürzen, sondern nur ein leeres Feld zurückgeben. Wenn Sie eine universellere Lösung benötigen, sehen Sie sich stacktrace.js . Seine Liste der unterstützten Browser ist wirklich beeindruckend, aber meiner Meinung nach ist es sehr groß für die kleine Aufgabe, für die es gedacht ist: 37Kb minifizierter Text einschließlich aller Abhängigkeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X