Niestandardowy
This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
Niestandardowa własność stack
obiektów Error
podaje ścieżkę wywołań funkcji – które z nich były wywołane, w jakiej kolejności, z której linii i pliku, z jakimi argumentami. Stos wywołań zaczyna się od ostatnich wywołań, przez wcześniejsze, prowadząc do pierwotnego wywołania z zakresu globalnego.
Opis
Każdy krok będzie znajdował się w oddzielnej linii, zawierając w pierwszej części nazwę funkcji (jeśli nie jest to wywołanie z zakresu globalnego), następnie znak at (@
), lokalizację pliku (z wyjątkiem sytuacji, w których funkcja jest konstruktorem zgłaszanego błędu), dwukropek oraz numer linii (jeśli zdefiniowana jest lokalizacja pliku). (Zauważ, że obiekt Error
także posiada własności fileName
, lineNumber
i columnNumber
, które można odczytać z danego błędu, jednak jedynie błędu, a nie jego stosu wywołań).
Należy podkreślić, że opisany wyżej format jest formatem przeglądarki Firefox – nie ma standardu formatowania, jednakże Safari 6+ i Opera 12- używają bardzo podobnego formatu. Przeglądarki używające silnika JavaScript V8 (takie jak Chrome, Opera 15+, Android Browser) oraz IE10+, używają natomiast innego formatu (zobacz archiwalną dokumentację MSDN dla error.stack).
Wartości argumentów w stosie: w wersjach wcześniejszych niż Firefox 14, po nazwie funkcji następowały wartości argumentów przekonwertowane do łańcucha znaków (string) w nawiasach, przed znakiem at (@
). Podczas gdy obiekt (lub tablica itp.) pojawia się w przekonwertowanej formie "[object Object]"
i nie może być przekonwertowany z powrotem do właściwych obiektów, wartości skalarne mogą być odzyskane (choć być może — w Firefoksie 14 nadal jest to możliwe — łatwiej będzie użyć arguments.callee.caller.arguments
, tak jak nazwa funkcji może być uzyskana przez arguments.callee.caller.name
). "undefined"
jest wylistowany jako "(void 0)"
. Zauważ, że jeśli argumenty typu string były przekazane z wartościami takimi jak "@"
, "("
, ")"
(lub znaki te występują w nazwach plików), nie możesz polegać po prostu na podzieleniu linii na części składowe – dlatego w Firefoksie 14 i nowszych jest to mniejszy problem.
Różne przeglądarki ustawiają tę wartość w różnych momentach. Przykładowo, Firefox ustawia ją podczas tworzenia obiektu Error
, natomiast PhantomJS ustawia ją jedynie podczas wyrzucania Error
– i archiwalna dokumentacja MSDN również wydaje się zgadzać z implementacją PhantomJS.
Przykłady
Użycie własności stack
Poniższy dokument HTML prezentuje użycie własności stack
.
<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>Stack Trace Example</title>
<body>
<script>
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');
</script>
Zakładając, że powyższy dokument zapisany jest pod adresem C:\example.html
w systemie plików Windows, kod utworzy okno typu alert z następującą treścią:
W przeglądarce Firefox 30 i późniejszych wersjach, wraz z numerem kolumny:
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
Od Firefoxa 14 do Firefoxa 29:
trace@file:///C:/example.html:9 b@file:///C:/example.html:16 a@file:///C:/example.html:19 @file:///C:/example.html:21
Firefox 13 i wcześniejsze zwróci zamiast tego następujący tekst:
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
Stos ewaluowanego kodu
Od Firefoxa 30, stos błędu w wywołaniach Function()
i eval()
tworzy stos z bardziej szczegółową informacją o linii i kolumnie wewnątrz tych wywołań. Wywołania funkcji są wskazywane przez "> Function"
, a eval przez "> eval"
.
try {
new Function('throw new Error()')();
} catch (e) {
console.log(e.stack);
}
// anonymous@file:///C:/example.html line 7 > 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 > eval line 1 > eval:1:1
// @file:///C:/example.html line 7 > eval:1:1
// @file:///C:/example.html:7:6
Możesz także użyć dyrektywy //# sourceURL
do nazwania źródła eval
. Zobacz też źródła Debug eval w dokumentacji Debuggera oraz w tym artykule.
Specyfikacje
Nie jest częścią żadnego standardu.
Wsparcie przeglądarek
BCD tables only load in the browser
Zobacz też
- Components.stack
- Projekty zewnetrzne: TraceKit i javascript-stacktrace
- MSDN: archiwalna dokumentacja error.stack
- Przegląd API stosu wywołań w JavaScript V8