【发布时间】:2012-05-17 01:57:40
【问题描述】:
我在调试 Web 应用程序时遇到问题。这非常令人沮丧,因为我一直在尝试用一个可以在 jsfiddle 上发布的小网页来重现该问题,但这似乎是“Higgs-Bugson”的一个案例。
我有一个带有大型 jQuery(document).ready() 处理程序的网页。问题是,当从 jQuery(document).ready() 处理程序中引发异常时,我会得到一个包含多个匿名函数的调用堆栈,并且没有指向实际引发异常的代码的指针。
每当我尝试用一个小网页重现此行为时,我总是得到一个指向引发异常的代码的指针,但在生产代码中,我从不获取堆栈指针。这使得调试更加令人沮丧和容易出错。
这里有人知道是什么导致了这种行为以及如何纠正吗?
更新:自从我发布这个问题以来已经有几个月了,我现在相信我已经最终重现了这个问题。我使用以下 HTML 重现该问题:
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
Factorial Page
<input type='button' value='Factorial' id='btnFactorial' />
<script src="Scripts/jquery-1.6.1.js" type="text/javascript"></script>
<script type='text/javascript'>
$(document).ready(documentReady);
function documentReady() {
$('#btnFactorial').click(btnFactorial_click);
factorial(-1);
}
function btnFactorial_click() {
var x;
x = prompt('Enter a number to compute factorial for.', '');
alert(x + '! = ' + factorial(x));
}
function factorial(x) {
if (x < 0)
throw new Error('factorial function doesn\'t support negative numbers');
else if (x === 0 || x === 1)
return 1;
else
return factorial(x - 1) * x;
}
</script>
</body>
</html>
查看代码,您会发现当您单击按钮时,代码会提醒阶乘您指定的数字。输入负数会产生错误。在这种情况下,Visual Studio 将捕获错误并突出显示发生错误的代码行,并显示包括factorial 和btnFactorial_click 的调用堆栈。
此代码还从 $(document).ready 处理程序调用 factorial(-1)。在这种情况下,Visual Studio 将突出显示移动到以下 jQuery 代码中的 finally 块(摘自 jquery-1.6.1.js,从第 987 行开始
// resolve with given context and args
resolveWith: function( context, args ) {
if ( !cancelled && !fired && !firing ) {
// make sure args are available (#8421)
args = args || [];
firing = 1;
try {
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
}
finally {
fired = [ context, args ];
firing = 0;
}
}
return this;
},
虽然没有显示调用堆栈,但 Visual Studio 会显示一个显示错误文本的弹出窗口。
这种奇怪行为的原因是什么?如何设计我的应用程序,以便轻松捕获源自 $(document).ready 等处理程序的错误?
【问题讨论】:
-
你能发布一个代码示例吗?
-
@izb,问题总是出现在我的生产代码中(我无法在此处发布),但从未出现在我编写的用于隔离问题的测试代码中。
-
(a) 尝试不同的浏览器 - 它们并不完全相同,(b) 尝试在 Firebug(在 Firefox 中)或 DragonFly(在 Opera 中)的帮助下进行调试,(c) 尝试捕捉你的自己的
try{} catch(e){}结构错误。 -
您是否有以任何方式更改代码的部署过程?此外,尝试构建一个尽可能接近生产克隆的“暂存”环境。然后你可以用
alert()s 和debugger;语句来点缀可疑代码。 -
@Taudris,我在开发和生产环境中遇到了完全相同的问题。
标签: jquery debugging exception exception-handling callstack