有没有办法在javascript中动态查看调用堆栈?
这是一个一般性问题,但问题代码如下: 有一个抛出到-handles例外的错误例程:有没有办法在javascript中动态查看调用堆栈?,javascript,html,Javascript,Html,这是一个一般性问题,但问题代码如下: 有一个抛出到-handles例外的错误例程: MyObj.prototype.err = function( msg ) { ... throw(msg); } 所以要扔, if( mybad ) this.err( 'my message' ); 希望err根据函数是否在调用堆栈中而表现不同 例如,可能是 funcA() -> func2() -> func3() -> err() 对 funcB() -> func3() -
MyObj.prototype.err = function( msg ) { ... throw(msg); }
所以要扔,
if( mybad ) this.err( 'my message' );
希望err根据函数是否在调用堆栈中而表现不同
例如,可能是
funcA() -> func2() -> func3() -> err()
对
funcB() -> func3() -> err()
如果funcA在上游,则希望提醒用户并停止;而如果funcB,则希望将消息写入控制台并继续
认识到解决问题的其他方法,但是如果在Chrome中创建和维护可以从环境中推断出的状态空间,那么我就不走运了
var err = function( msg ) {
// ...
var error = new Error();
var stack = error.stack;
// Do some string manipulation with stack
// mayThrow = 'funcB is in stack'
if (mayThrow) {
throw(msg);
}
};
我可以指出,我认为这是一个非常糟糕的做法。我认为您应该捕获FuncB中的错误,而不是将FuncB定义为一个不会在错误中抛出的函数。它的代码更少,更易于管理。因此:
var err = function( msg ) {
// ...
throw(msg);
};
var func3 = function() {
// ...
err('Double rainbow');
};
var funcB = function() {
try {
func3();
catch(e) {
console.log(e);
}
};
试着理解为什么这是更好的解决方案,它是关于定义哪个功能属于哪个功能的责任。这正是异常和处理按此方式设计的原因。我不确定您要解决什么问题,但我非常确定有比这更好的方法 也就是说,这里有一种跟踪函数和检查调用堆栈的方法,而无需解析特定于浏览器的堆栈跟踪:
var callstack = [];
function traced(name, func) {
return function () {
callstack.push(name);
func.apply(this, arguments);
callstack.pop();
}
}
然后像这样使用它:
var a = traced("a", function () {
b();
});
var b = traced("b", function () {
c();
});
var c = traced("c", function () {
var s = callstack.join("<br>");
document.getElementById('output').innerHTML = s;
});
document.getElementById('a').onclick = a;
document.getElementById('b').onclick = b;
您可以在这里的fiddle上查看它:+1分享您的经验:创建和维护状态空间的厄运可以推断是一篇有趣的博客文章。然而,因为我同意你的最后一句话,这似乎是一个坏运气的方法,它肯定会非常缓慢。