Web Development Knowledge Base
| |
Sections :
Vous aussi, aidez les autres développeurs, publiez vos bouts de codes utiles et vos liens préférés ... Publiez un article ! Plateforme d'envoi de gros fichiers en ligne Script PHP de boutique en ligne Mondes virtuels gratuits en 3D |
Olivier Ligny - - 22/10/2009 - vue 1067 fois
getStackTrace() en JavaScript pour récupérer la pile des appels de fonctionsQuand on programme en Java, la localisation des erreurs qui ont lieu lors de l'exécution est assez simple car on obtient le plus souvent une vue de la pile des appels, c'est à dire la liste des fonctions qui ont été appelées les unes par les autres (récursivement). En JavaScript, rien de tel n'existe pour débugger un programme, et souvent on ne peut pas savoir dans quel contexte elle a eu lieu.
function getStackTrace() {
var callstack = [];
var isCallstackPopulated = false;
try {
i.dont.exist+=0; //doesn't exist- that's the point
} catch(e) {
if (e.stack) { //Firefox
var lines = e.stack.split("\n");
for (var i=0, len=lines.length; i<len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
callstack.push(lines[i]);
}
}
//Remove call to printStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
else if (window.opera && e.message) { //Opera
var lines = e.message.split("\n");
for (var i=0, len=lines.length; i<len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
var entry = lines[i];
//Append next line also since it has the file info
if (lines[i+1]) {
entry += " at " + lines[i+1];
i++;
}
callstack.push(entry);
}
}
//Remove call to printStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
}
if (!isCallstackPopulated) { //IE and Safari
var currentFunction = arguments.callee.caller;
while (currentFunction) {
var fn = currentFunction.toString();
var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
callstack.push(fname);
currentFunction = currentFunction.caller;
}
}
return callstack.join('\n');
}
Et pour tester :
function hop() {
try {
alert(nonExistentVariable);
} catch(e) {
alert(getStackTrace());
}
}
function myFunc() {
hop();
}
function test() {
myFunc();
}
test();
|