регистрировать ошибки с трассировкой стека в JavaScript - PullRequest
12 голосов
/ 25 декабря 2009

Я пытаюсь регистрировать ошибки 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, часть «try {i.dont.exist + = 0;}» больше не генерирует никаких исключений, и двигатель останавливается без любая ошибка В приведенном выше примере с расширением catcherr следующим образом, только «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)
    // ...
}

У кого-нибудь есть идея, почему это происходит, когда в функции «ready» jquery возникает ошибка?

Ответы [ 3 ]

8 голосов
/ 29 декабря 2009

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

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

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

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

1 голос
/ 25 декабря 2009

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

0 голосов
/ 29 декабря 2009

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

...