Web Development Knowledge Base
| |
Sections :
RSS Feed You too, please publish your useful code snippets in any programming language : write an article ! 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 29422 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(); |
Nos partenaires : iPhone 8 Cases & Protection |