У меня проблема с отладкой моих веб-приложений. Это очень расстраивает, потому что я пытался воспроизвести проблему с небольшой веб-страницей, которую я могу опубликовать на jsfiddle, но, похоже, это случай «Хиггса -Багсона».
У меня есть веб-страница с большим обработчиком 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 перемещает выделение на блок finally в следующем коде jQuery (, взятом из 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?