Ich verwende Folgendes, um den Funktionsnamen des JavaScript-Aufrufers abzurufen:
var callerFunc = arguments.callee.caller.toString();
callerFuncName = (callerFunc.substring(callerFunc.indexOf("function") + 8, callerFunc.indexOf("(")) || "anoynmous")
Gibt es eine Möglichkeit, die Zeilennummer zu ermitteln, von der aus die Methode aufgerufen wurde?
Gibt es auch eine Möglichkeit, den Namen der JavaScript-Datei abzurufen, aus der die Methode aufgerufen wurde? Oder die Quell-URL?
javascript
Tal
quelle
quelle
Antworten:
Dies funktioniert bei mir in Chrome / QtWebView
quelle
var caller_line = (new Error).stack.split("\n")[4]
Die Lösung von kangax führt unnötige try..catch-Bereiche ein. Wenn Sie auf die Zeilennummer von etwas in JavaScript zugreifen müssen (solange Sie Firefox oder Opera verwenden), greifen Sie einfach zu
(new Error).lineNumber
.quelle
Ich war überrascht, dass die meisten dieser Antworten davon ausgegangen sind, dass Sie einen Fehler behandeln möchten, anstatt nur hilfreiche Debug-Traces für normale Fälle auszugeben.
Zum Beispiel verwende ich gerne einen
console.log
Wrapper wie diesen:Dadurch wird eine Ausgabe wie die folgende auf meiner Konsole gedruckt:
1462567104174 [getAllPosts@http://me.com/helper.js:362:9]
Siehe https://stackoverflow.com/a/27074218/ und auch einen richtigen Wrapper für console.log mit der richtigen Zeilennummer?
quelle
Dies wird häufig erreicht, indem ein Fehler aus dem aktuellen Kontext ausgegeben wird. dann Analyse des Fehlerobjekts auf Eigenschaften wie
lineNumber
undfileName
(die einige Browser haben)Vergessen Sie nicht, dass
callee.caller
Eigentum veraltet ist (und nie wirklich in ECMA 3. Ausgabe war).Denken Sie auch daran, dass die Funktionsdekompilierung als implementierungsabhängig angegeben wird und daher zu unerwarteten Ergebnissen führen kann. Ich habe hier und hier darüber geschrieben .
quelle
callee.caller
.line
nur ausgefüllt, wenn ein Fehler ausgegeben wird.Es scheint, dass ich etwas spät dran bin :), aber die Diskussion ist ziemlich interessant, also ... hier ist es ... Angenommen, Sie möchten einen Fehlerhandler erstellen und verwenden Ihre eigene Ausnahmebehandlungsklasse wie:
Und Sie verpacken Ihren Code folgendermaßen:
Höchstwahrscheinlich haben Sie den Fehlerbehandler in einer separaten .js-Datei.
Sie werden feststellen, dass in der Firefox- oder Chrome-Fehlerkonsole die angezeigte Codezeilennummer (und der Dateiname) die Zeile (Datei) ist, die die Ausnahme 'Error' auslöst, und nicht die Ausnahme 'errorHandler', die Sie wirklich für das Debuggen benötigen einfach. Das Auslösen eigener Ausnahmen ist großartig, aber bei großen Projekten kann das Auffinden dieser Ausnahmen ein ziemliches Problem sein, insbesondere wenn sie ähnliche Meldungen enthalten. Sie können also einen Verweis auf ein tatsächlich leeres Fehlerobjekt an Ihren Fehlerbehandler übergeben, und dieser Verweis enthält alle gewünschten Informationen (z. B. können Sie in Firefox den Dateinamen und die Zeilennummer usw. abrufen. ; in Chrome erhalten Sie etwas Ähnliches, wenn Sie die Eigenschaft 'stack' der Fehlerinstanz lesen. Kurz gesagt, Sie können so etwas tun:
Jetzt können Sie die tatsächliche Datei- und Zeilennummer abrufen, die Ihre benutzerdefinierte Ausnahme ausgelöst hat.
quelle
Die Zeilennummer ist eigentlich etwas Statisches. Wenn Sie sie also nur zum Protokollieren verwenden möchten, kann sie mit etwas wie Schlucken vorverarbeitet werden. Ich habe ein kleines Schluck- Plugin geschrieben , das genau das tut:
Dies wird den Dateinamen und Zeile für alle Protokolle von console.log befestigen, so
console.log(something)
wird wordenconsole.log('filePath:fileNumber', something)
. Der Vorteil ist, dass Sie jetzt Ihre Dateien zusammenfassen, transpilieren können ... und Sie trotzdem die Zeile erhaltenquelle
Mir ist klar, dass dies eine alte Frage ist, aber es gibt jetzt eine Methode namens
console.trace("Message")
, die Ihnen die Zeilennummer und die Kette von Methodenaufrufen anzeigt, die zum Protokoll geführt haben, zusammen mit der Nachricht, die Sie übergeben haben. Weitere Informationen zu Javascript-Protokollierungstricks finden Sie hier im freecodecamp und in diesem mittleren Blogbeitragquelle
Wenn Sie die Zeilennummer zu Debugging-Zwecken oder nur während der Entwicklung (aus dem einen oder anderen Grund) wissen möchten, können Sie Firebug (eine Firefox-Erweiterung) verwenden und werfen eine Ausnahme.
Bearbeiten :
Wenn Sie dies aus irgendeinem Grund in der Produktion wirklich tun müssen, können Sie Ihre Javascript-Dateien vorverarbeiten, damit jede Funktion die Linie verfolgt, in der sie sich befindet. Ich weiß, dass einige Frameworks, die die Abdeckung von Code finden, dies verwenden (wie JSCoverage ).
Angenommen, Ihr ursprünglicher Anruf lautet:
Sie könnten einen Präprozessor schreiben, um daraus zu machen:
Dann
y()
könnten Sie in verwendenarguments.callee.caller.line
, um die Zeile zu kennen, von der es aufgerufen wurde, wie zum Beispiel:quelle
Folgendes habe ich basierend auf Informationen in diesem Forum geschrieben:
Dies ist Teil eines MyDebugNamespace. Debug ist anscheinend reserviert und wird nicht als Namespace-Name verwendet.
...
...
So rufen Sie an:
Ich habe zwei Funktionen mit variabler Anzahl von Argumenten, die diesen Basiscode aufrufen, in meinen Namespace aufgenommen, um optional Nachrichten oder Fehler bei Aufrufen wegzulassen.
Dies funktioniert gut mit Firefox, IE6 und Chrome melden den Dateinamen und die Zeilennummer als undefiniert.
quelle
Der folgende Code funktioniert für mich in Mozilla und Chrome.
Seine Protokollfunktion, die den Namen der Datei und die Zeile des Anrufers anzeigt.
quelle
SyntaxError: function statement requires a name,log: function (arg) {
Mein Beitrag zu benutzerdefinierten Fehlern in JavaScript:
Erstens stimme ich diesem @ BT-Typ beim Erben vom Fehlerobjekt zu - wo ist die Nachrichteneigenschaft? , wir müssen es richtig erstellen (eigentlich müssen Sie eine js-Objektbibliothek verwenden, mein Favorit: https://github.com/jiem/my-class ):
Dann sollten wir eine globale Fehlerbehandlungsfunktion definieren (optional), oder sie landen bei der Engine:
Schließlich sollten wir unsere benutzerdefinierten Fehler sorgfältig werfen:
Nur wenn
new Error()
wir den dritten Parameter übergeben, können wir den Stapel mit Funktions- und Zeilennummern sehen!Bei 2 kann die Funktion auch Fehler verarbeiten, die vom Motor ausgelöst werden.
Die eigentliche Frage ist natürlich, ob und wann wir sie wirklich brauchen. Es gibt Fälle (99% meiner Meinung nach), in denen eine würdevolle Rückkehr von
false
ausreicht und nur einige kritische Punkte mit einem Fehler angezeigt werden.Beispiel: http://jsfiddle.net/centurianii/m2sQ3/1/
quelle
So habe ich es gemacht, ich habe es sowohl in Firefox als auch in Chrome getestet. Auf diese Weise können Sie den Dateinamen und die Zeilennummer des Ortes überprüfen, von dem aus die Funktion aufgerufen wird.
quelle
Es zeigt Ihnen den gesamten Track.
quelle
Um festzustellen, in welcher Zeile sich etwas befindet, müssen Sie den gesamten Code nach dem Code durchsuchen, der die jeweilige interessierende Zeile belegt, und die "\ n" -Zeichen von oben bis zu dieser interessierenden Zeile zählen und 1 hinzufügen.
Ich mache genau das in einer Bewerbung, die ich schreibe. Es ist ein Best-Practice-Validator für HTML und befindet sich noch in der Entwicklung, aber der Fehlerausgabevorgang, an dem Sie interessiert wären, ist abgeschlossen.
http://mailmarkup.org/htmlint/htmlint.html
quelle
Die Antworten sind einfach. Nein und Nein (Nein).
Bis Javascript das Konzept der Quelldateien / URLs ausführt, von denen das Kommen weg ist.
Es gibt auch keine Möglichkeit, eine Zeilennummer zu bestimmen, da der Begriff "Zeilen" zum Zeitpunkt der Ausführung in Javascript wiederum nicht mehr von Bedeutung ist.
Bestimmte Implementierungen können API-Hooks bereitstellen, um privilegierten Code zum Debuggen auf solche Details zuzugreifen. Diese APIs sind jedoch keinem normalen Standard-Javascript-Code ausgesetzt.
quelle