Подтвердить что ты не робот

Ошибки журнала с трассировкой стека в 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 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?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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