我在调试 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
。
此代码还factorial(-1)
从 $(document).ready 处理程序调用。在这种情况下,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 等处理程序的错误?