Стек вызовов теряется при возникновении исключения в обработчике jQuery

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

12
задан Daniel Allen Langdon 2 August 2012 в 18:47
поделиться