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



RSS RSS Feed

You too, please publish your useful code snippets in any programming language :
write an article !


Valid HTML 4.0 Transitional

Plateforme d'envoi de gros fichiers en ligne
Dépannage site web
Blog infogérance
Hébergement e-mail

Olivier Ligny - - 22/10/2009 - vue 29271 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 : what animal is visible on this picture ? :

Nos partenaires : iPhone 8 Cases & Protection