Регистрировать ошибки с трассировкой стека в 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, часть "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)
    // ...
}

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

3 ответа

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

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

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

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

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

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

Другие вопросы по тегам