ошибки журнала с отслеживанием стека в JavaScript

Я пытаюсь зарегистрировать ошибки JavaScript в продуктивный сайт. До сих пор это работало вполне хорошо со следующим кодом, включенным в сайт:

function catcherr(errorMessage, url, line) {
    var parameters = "msg=" + escape(errorMessage)
            + "&url=" + escape(url)
            + "&line=" + escape(line);

    new Image().src = "/error.gif?" + parameters;

    return false;
};

window.onerror = catcherr;

Я пытаюсь добавить отслеживание стека к ошибкам получить больше информации. Это в основном работает со следующей идеей включая в функцию выше:

    try { i.dont.exist += 0; } // does not exist - that's the point
    catch (e)
    {
            if (e.stack) // Firefox
            {
               // do some stuff

Я использую jQuery, простой пример:

<script type="text/javascript">
jQuery(document).ready(function() {
    p.foo += 1; // this should throw an error
    // do stuff
});
</script>

Забавная часть, это, когда у меня есть ошибка в "готовой" функции jQuery, часть "попытка {i.dont.exist + = 0;}" больше не выдает исключения и остановок механизма ни без какой ошибки. С примером выше, и ловец, расширенный следующим образом, только "1" предупрежден:

function catcherr(errorMessage, url, line) {
    try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);}
    alert(2);
    var parameters = "msg=" + escape(errorMessage)
    // ...
}

Кто-либо имеющий идею, почему это повреждается, когда ошибка происходит в "готовой" функции jQuery?

12
задан 2ni 25 December 2009 в 14:25
поделиться

3 ответа

Скорее всего, jQuery оборачивает обратный вызов в свой собственный try / catch и игнорирует ошибку.

1
ответ дан 2 December 2019 в 22:38
поделиться

Не знаю, почему у вас такая проблема (выглядит очень странно, и я не думаю, что это проблема, когда JQuery съедает ваши исключения, так как ваше предупреждение(1) не выстрелило бы), но я хотел упомянуть о вашем использовании Error. stack - когда вызывается событие onerror, у вас нет контекста стека исходной ошибки, поэтому получение трассы стека в этот момент (путем перехвата вашей собственной ошибки) не даст осмысленного стека.

Но вернемся к реальному ответу - вместо того, чтобы симулировать проблему, написав специально взломанный код, чтобы вы могли перехватить ошибку, как насчет того, чтобы просто напрямую бросить ошибку? Первая строка в вашем онеррорном обработчике может быть:

try { throw new Error("dummy"); } catch (e) { alert(e.stack); }

Это корректный код, который скорее всего не вызовет у вас проблем.

.
8
ответ дан 2 December 2019 в 22:38
поделиться

Попробуйте другое исключение внутри try/catch. например a=1/0 или baddarr[5]='bad' и посмотрим, срабатывают ли эти исключения. Иногда ошибки "Объект не найден" могут возникать из-за того, что объекты еще не загружены, и для них может быть другая обработка, нежели для других исключений.

0
ответ дан 2 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: