DevKB
Web Development Knowledge Base
HOME | TOP 20 | WRITE AN ARTICLE |
Sections :


RSS RSS Feed

Vous aussi, aidez les autres développeurs, publiez vos bouts de codes utiles et vos liens préférés ...
Publiez un article !


Valid HTML 4.0 Transitional

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 318 fois

getStackTrace() en JavaScript pour récupérer la pile des appels de fonctions

Quand 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).
On sait ainsi que la fonction A() a appelé la fonction B() qui a appelé la fonction C() qui a provoqué une erreur.

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.
J'ai trouvé le script suivant sur un forum dont j'ai perdu l'adresse, il permet de récupérer la liste complète des appels, comme en Java.
Cet outil de débogage est compatible IE, FireFox, Opera et Safari.

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();



Write a comment :
Your name :     E-mail (optional) :

AntiSpam : please write the result of 657 x 925 =