aboutsummaryrefslogtreecommitdiff
path: root/files/de/web/javascript/reference/global_objects/error/stack/index.html
blob: 196e46dbbf1537fb4b2c91eb1469cd775e42ba1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
---
title: Error.prototype.stack
slug: Web/JavaScript/Reference/Global_Objects/Error/Stack
tags:
  - Error
  - JavaScript
  - Non-standard
  - Property
  - Prototype
  - Reference
translation_of: Web/JavaScript/Reference/Global_Objects/Error/Stack
---
<div>{{JSRef}} {{non-standard_header}}</div>

<p>Die nicht standardisierte <strong><code>stack</code></strong> Eigenschaft des {{jsxref("Error")}} Objektes zeigt den Verlauf der aufgerufenen Funktionen. Dabei wird die Reihenfolge der Aufrufe, der Zeile und die Datei der Aufrufes und die übergebenen Argumenten angegeben. Der stack String verläuft von den jüngsten Aufrufen zu den vorherigen Aufrufen, bis zum globalen Scope zurück.</p>

<h2 id="Beschreibung">Beschreibung</h2>

<p>Jeder Schritt wird durch einen neue Zeile getrennt. Der erste Teil einer Zeile besteht aus dem Funktionsnamen (wenn es kein Aufruf vom globalen Scope ist), gefolgt von einem @-Zeichen, dem Dateiort (ausgenommen, wenn die Funktion der Error-Konstruktor des geworfenen Errors ist), einem Doppelpunkt und einer Zeilennummer, wenn ein Dateiort existiert. Zu beachten ist, dass das {{jsxref("Error")}} Objekt auch die Eigenschaften <code>fileName</code>, <code>lineNumber</code> und <code>columnNumber</code> besitzt, um dieses von geworfenen Error wiederherzustellen (aber nur dem Fehler und nicht seinem trace).</p>

<p>Zu beachten ist, dass dieses das Format von Firefox ist. Es gibt keine Standardformat, auch wenn Safari 6+ und Opera 12- ein ähnliches Format verwenden. Browser die die V8 JavaScript Umgebung benutzen (z. B. Chrome, Opera 15+, Android Browser) und IE10+ nutzen ein anderes Format (zusehen in den MSDN <a class="external" href="http://msdn.microsoft.com/en-us/library/windows/apps/hh699850.aspx">error.stack</a> docs).</p>

<p><strong>Parameter Werte im Stack:</strong> Bis Firefox 14 ({{bug("744842")}}) folgten auf den Funktionsnamen die zu Strings konvertierten Werte der Parameter in runden Klammern vor dem @-Zeichen. Während ein Objekt (oder Array, etc.) zu<code> "[object Object]"</code> konvertiert werden und diese Werte nicht zurück zu einem existierenden Objekt ausgewertet werden können, können skalare Werte zurückverfolgt werden (manchmal kann es einfacher sein — nur in Firefox 14 möglich — <code>arguments.callee.caller.arguments</code> zu benutzen, der Funktionsname kann mit <code>arguments.callee.caller.name</code> erfragt werden). <code>"undefined"</code> wird mit <code>"(void 0)"</code> dargestellt. Zu beachten ist, dass String Argumente (oder auch Dateinamen), die Zeichen wie "@", "(", ")" beinhalten dazu führen, dass es nicht einfach ist, die Zeile in seine Komponenten aufzuteilen. In Firefox 14+ ist dieses kein Problem mehr.</p>

<p>Verschiedene Browser setzen den this Wert zu verschiedenen Zeitpunkten. Zum Beispiel setzt Firefox diesen beim erstellen eines {{jsxref("Error")}} Objektes, während PhantomJS dieses nur setzt, wenn das {{jsxref("Error")}} Objekt geworfen wird und <a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh699850.aspx">MSDN docs</a> scheinen diesem verhalten auch zu folgen.</p>

<h2 id="Beispiele">Beispiele</h2>

<p>Der folgende HTML-Quelltext demonstriert den Einsatz der <code>stack</code> Eigenschaft.</p>

<pre class="brush: html">&lt;!DOCTYPE HTML&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;Stack Trace Example&lt;/title&gt;
&lt;body&gt;
&lt;script&gt;
function trace() {
  try {
    throw new Error('myError');
  }
  catch(e) {
    alert(e.stack);
  }
}
function b() {
  trace();
}
function a() {
  b(3, 4, '\n\n', undefined, {});
}
a('first call, firstarg');
&lt;/script&gt;
</pre>

<p>Angenommen der oben stehende Quelltext ist auf einen Windows Datei System unter <code>C:\example.html</code> gespeichert, wird der folgende Text ausgegeben:</p>

<p>Mit Firefox 30+ wird die Spaltennummer mit angegeben ({{bug("762556")}}):</p>

<pre><samp>trace@file:///C:/example.html:9:17
b@file:///C:/example.html:16:13
a@file:///C:/example.html:19:13
@file:///C:/example.html:21:9</samp></pre>

<p>Von Firefox 14 bis Firefox 29:</p>

<pre><samp>trace@file:///C:/example.html:9
b@file:///C:/example.html:16
a@file:///C:/example.html:19
@file:///C:/example.html:21</samp></pre>

<p>Bis Firefox 13 wird folgender Text ausgegeben:</p>

<pre><samp>Error("myError")@:0
trace()@file:///C:/example.html:9
b(3,4,"\n\n",(void 0),[object Object])@file:///C:/example.html:16
a("first call, firstarg")@file:///C:/example.html:19
@file:///C:/example.html:21</samp></pre>

<h3 id="Stacks_von_eval_Quelltext">Stacks von eval Quelltext</h3>

<p>Angefangen mit Firefox 30 {{geckoRelease("30")}} enthällt der Stack von Errors auch Informationen von <code>Function()</code> und <code>eval()</code> Aufrufen mit detailierten Spalten- und Zeilennummern innerhalb dieser Aufrufe. Funktionsaufrufe werden mit <code>"&gt; Function"</code> angezeigt, Aufrufe mit eval werden mit <code>"&gt; eval"</code> angezeigt. Siehe {{bug("332176")}}.</p>

<pre class="brush: js">try {
  new Function('throw new Error()')();
} catch (e) {
  console.log(e.stack);
}

// anonymous@file:///C:/example.html line 7 &gt; Function:1:1
// @file:///C:/example.html:7:6


try {
  eval("eval('FAIL')");
} catch (x) {
  console.log(x.stack);
}

// @file:///C:/example.html line 7 &gt; eval line 1 &gt; eval:1:1
// @file:///C:/example.html line 7 &gt; eval:1:1
// @file:///C:/example.html:7:6
</pre>

<p>Man kann auch die <code>//# sourceURL</code> Direktive benutzen, um den eval-Code zu benennen. Siehe auch <a href="/de/docs/Tools/Debugger/How_to/Debug_eval_sources">Debug eval sources</a> in den <a href="/de/docs/Tools/Debugger">Debugger</a> docs und diesen <a href="http://fitzgeraldnick.com/weblog/59/">Blogeintrag</a>.</p>

<h2 id="Spezifikationen">Spezifikationen</h2>

<p>Ist kein Teil einer Spezifikation, nicht standardisiert.</p>

<h2 id="Browserkompatibilität">Browserkompatibilität</h2>

<div>


<p>{{Compat("javascript.builtins.Error.stack")}}</p>
</div>

<h2 id="Siehe_auch">Siehe auch</h2>

<ul>
 <li><a href="/de/docs/Components.stack">Components.stack</a></li>
 <li>Externe Projekte: <a class="link-https" href="https://github.com/csnover/TraceKit/">TraceKit</a> und <a class="link-https" href="https://github.com/eriwen/javascript-stacktrace">javascript-stacktrace</a></li>
 <li>MSDN: <a class="external" href="http://msdn.microsoft.com/en-us/library/windows/apps/hh699850.aspx">error.stack</a> docs</li>
 <li><a href="https://github.com/v8/v8/wiki/Stack%20Trace%20API">Überblick über die V8 JavaScript Stack Trace API</a></li>
</ul>