Non-standard
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.
Resum
La propietat no standard stack
dels objectes Error
ofereix una traça de quines funcions han estat cridades, en quin ordre, des de quina línia i fitxer, i amb quins arguments. La stack, en forma de string, va de les crides més recent a les més antigues, fins a arribar a la crida original del context global.
Descripció
Cada pas estarà separat per una nova línia, on la primera part de cada línia és el nom de la funció (si no es tracta d'una crida des del context global), seguit per pel símbol arroba (@), la ruta del fitxer (excepte quan la funció és la funció constructora de l'error mentre s'està llençant l'error), un punt i coma, i, si hi ha una ruta de fitxer, el nombre de línia. Fixeu-vos que l'objecte Error
també disposa de les propietats filename
, lineNumber
i columnNumber
de l'error llençat (però no de la traça).
Cal remarcar que aquest és el format utilitzat per Firefox. No hi ha un formateig standard. Tot i així, Safari 6+ i Opera 12- utilitzen un format molt similar. Els navegadors que utilitzen el motor de JavaScript V8 (com ara Chrome, Opera 15+ i el navegador de Android), així com IE10+, d'altra banda, utilitzen un format diferent (vegeu el document de la MSDN error.stack).
Valors dels arguments a la pila: Abans del (errada 744842) de Firefox 14, el nom de la funció anava seguit dels valors dels arguments convertits a string entre parèntesi immediatament abans de l'arroba (@). Un objecte (o un array, etc) apareixeria en la forma convertida "[object Object]"
, i en conseqüència no podria ser evaluada de nou en objectes. Si que es poden obtenir els valors escalars (tot i que resulta més senzill utilitzar arguments.callee.caller.arguments
, així com es pot trobar el nom de la funció a arguments.callee.caller.name
). "undefined"
apareix com a "(void 0)"
. Cal tenir en compte que si s'han passat arguments de tipus string que continguin caracters com ara "@"
, "("
, ")"
(o bé noms de fitxers), resulta força complicat utiltizar-los per a trencar la línia en les diferents parts que la composen. Degut a això, a partir de Firefox 14 això deixa de ser un problema.
Exemple
El següent codi HTML mostra l'ús de la propietat stack
.
<!DOCTYPE HTML> <meta charset="UTF-8"> <title>Exemple de pila de traça</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('primera crida, primerArgument'); </script>
Assumint que el codi resideix al fitxer C:\exemple.html
en un sistema de fitxers de Windows, aquest generarà un missatge d'alerta amb el text següent:
A partir de Firefox 30 contindrà el nombre de la columna (errada 762556):
trace@file:///C:/exemple.html:9:17 b@file:///C:/exemple.html:16:13 a@file:///C:/exemple.html:19:13 @file:///C:/exemple.html:21:9
Firefox 14 a Firefox 29:
trace@file:///C:/exemple.html:9 b@file:///C:/exemple.html:16 a@file:///C:/exemple.html:19 @file:///C:/exemple.html:21
Per contra, Firefox 13 i versions prèvies produian el següent text:
Error("myError")@:0 trace()@file:///C:/exemple.html:9 b(3,4,"\n\n",(void 0),[object Object])@file:///C:/exemple.html:16 a("primera crida, primerArgument")@file:///C:/exemple.html:19 @file:///C:/exemple.html:21
Pila de codi evaluat
A partir de Firefox 30 (Firefox 30 / Thunderbird 30 / SeaMonkey 2.27 / Firefox OS 1.4), la pila d'error pertanyent a codi dins de crides a Function()
i eval()
conté informació més detallada sobre la línia i la columna que ha produït l'error dins aquestes crides. Les crides a funcions s'indiquen amb "> Function"
i les crides a eval amb "> eval"
. Vegeu errada 332176.
try { new Function('throw new Error()')(); } catch (e) { console.log(e.stack); } // anonymous@file:///C:/exemple.html line 7 > Function:1:1 // @file:///C:/example.html:7:6 try { eval("eval('FAIL')"); } catch (x) { console.log(x.stack); } // @file:///C:/exemple.html line 7 > eval line 1 > eval:1:1 // @file:///C:/exemple.html line 7 > eval:1:1 // @file:///C:/exemple.html:7:6
També podeu utilitzar la directiva //# sourceURL
per a donar nom a codi eval. Vegeu també Depurar codi eval als documents de Depurar així com en aquesta entrada d'un bloc.
Especificacions
No forma part de cap especificació. No és standard.
Compatibilitat amb navegadors
Característica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suport bàsic | (Yes) | (Yes) | 10 | (Yes) | 6 |
Característica | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Suport bàsic | Android 4 (potser Android 3, però en cap cas Android 2) | ? | ? | ? | ? | 6 |
Vegeu també
- Components.stack
- Projectes externs: TraceKit ijavascript-stacktrace
- MSDN: documents error.stack
- Un cop d'ull a la API de traça de pila del motor JavaScript V8