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