Gav*_*vin 7 javascript debugging
我遇到了这种方法来生成一个Javascript堆栈跟踪(以修复IE特定的bug):http://pastie.org/253058.txt听起来非常有用,但是当我调用它时,我得到的堆栈跟踪是为了脚本本身的代码?!
可以更改此代码以生成一般堆栈跟踪吗?或者有更好的方法来获取IE中的堆栈跟踪?
(function () {
YOUR_NAMESPACE.getStackTrace = (function () {
var mode;
try {(0)()} catch (e) {
mode = e.stack ? 'Firefox' : window.opera ? 'Opera' : 'Other';
}
switch (mode) {
case 'Firefox' : return function () {
try {(0)()} catch (e) {
return e.stack.replace(/^.*?\n/,'').
replace(/(?:\n@:0)?\s+$/m,'').
replace(/^\(/gm,'{anonymous}(').
split("\n");
}
};
case 'Opera' : return function () {
try {(0)()} catch (e) {
var lines = e.message.split("\n"),
ANON = '{anonymous}',
lineRE = /Line\s+(\d+).*?in\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i,
i,j,len;
for (i=4,j=0,len=lines.length; i<len; i+=2) {
if (lineRE.test(lines[i])) {
lines[j++] = (RegExp.$3 ?
RegExp.$3 + '()@' + RegExp.$2 + RegExp.$1 :
ANON + RegExp.$2 + ':' + RegExp.$1) +
' -- ' + lines[i+1].replace(/^\s+/,'');
}
}
lines.splice(j,lines.length-j);
return lines;
}
};
default : return function () {
var curr = arguments.callee.caller,
FUNC = 'function', ANON = "{anonymous}",
fnRE = /function\s*([\w\-$]+)?\s*\(/i,
stack = [],j=0,
fn,args,i;
while (curr) {
fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
args = stack.slice.call(curr.arguments);
i = args.length;
while (i--) {
switch (typeof args[i]) {
case 'string' : args[i] = '"'+args[i].replace(/"/g,'\\"')+'"'; break;
case 'function': args[i] = FUNC; break;
}
}
stack[j++] = fn + '(' + args.join() + ')';
curr = curr.caller;
}
return stack;
};
}
})();
Run Code Online (Sandbox Code Playgroud)
Jus*_*wig 12
此getStackTrace()函数创建您调用的函数的堆栈跟踪getStackTrace().它并没有创造你赶上了错误的堆栈跟踪.例如,您将使用它来试图找出如何调用特定函数:
function foo() {
// debug how this is being called
alert(YOUR_NAMESPACE.getStackTrace());
}
Run Code Online (Sandbox Code Playgroud)
或者为您引发的错误添加更多细节:
function foo() {
// signal something went wrong
var error = new Error("error in foo");
if (!error.stack)
error.stack = YOUR_NAMESPACE.getStackTrace();
throw error;
}
Run Code Online (Sandbox Code Playgroud)
你不能这样使用它:
try {
foo();
} catch (e) {
alert(YOUR_NAMESPACE.getStackTrace(e));
}
Run Code Online (Sandbox Code Playgroud)
这里有一个很好的概述,你可以获得什么样的堆栈信息 - 以及从哪些浏览器 - 发生错误时:在Javascript中获取堆栈跟踪的三种痛苦方法(Archive.org链接替换死链接)
| 归档时间: |
|
| 查看次数: |
11674 次 |
| 最近记录: |