yarkov
@yarkov
Помог ответ? Отметь решением.

Как работают ошибки в JavaScript?

Не могу побороть перехват ошибок. Казалось бы тривиальная задача, но тем не менее вот споткнулся.
Подключаю внешний скрипт с таким содержанием:
window.onerror = function (message, filename, lineno, colno, error) {
    console.log("This is a stack trace! Wow! --> %s", error.stack);
    return false;
};

Подключаю сразу после открывающегося тега <head>:
<script src="/build/setup-error-handler.js?v1"></script>


На странице ниже подключается скрипт:
$(function(){
    // ...
});


А jQuery не подключается и я в консоли вижу ошибку:
script.js:1 Uncaught ReferenceError: $ is not defined


А вот мой обработчик в самом верху не работает.

Как так?

Если в консоли выполнить код:
const script = document.createElement('script');
script.textContent = `
setTimeout(() => {
  throw new Error('Test reportError function')
}, 1000)`;
document.body.appendChild(script);


Тогда обработчик вызывается.
  • Вопрос задан
  • 502 просмотра
Пригласить эксперта
Ответы на вопрос 3
ArsenyMatytsyn
@ArsenyMatytsyn Куратор тега JavaScript
Руководитель frontend направления, предприниматель
Я начал вводить «window.onerror» в поисковике, и он мне сразу подкинул «window.onerror not working». Судя по всему, ответ уже давно измусолен где-нибудь на стаке.

UPD: Кстати, посмотри первый абзац документации. И попробуй симитировать другую ошибку на странице, чтобы проверить, входит ли данная ошибка в список тех, что словит window.onerror или нет.
Ответ написан
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
Возможно, что проблема даже не в js, а в сервере. Если взять страницу такого вида:
<!DOCTYPE html>
<html>
    <head>
        <script src='./s1.js'></script>
        <!-- s1.js:
            window.onerror = function(message, filename, line, col, error) {
                console.log('Oops: %s', error.stack);
                return false;
            };
        -->
    </head>
    <body>
        <script src='./s2.js'></script>
        <!-- s2.js:
            $(function() {

            });
         -->
    </body>
</html>

И захостить ее вместе со скриптами на одном сервере, на одном домене, то все будет работать. Если домены у страницы и скриптов разные - onerror работать не будет (там что-то с безопасностью связано). Если страница открыта в браузере просто как файл, то по идее браузер может считать каждый скрипт, подключаемый к ней, как лежащий на другом домене, и тоже ничего работать не будет.
Ответ написан
profesor08
@profesor08 Куратор тега JavaScript
Наверно потому, что это не ошибка, а исключительная ситуация. Ты пытаешься обратиться к тому, чего нет. Подобные вещи отлавливаются с помощь `try/catch`

try {
  $(".asdasd").each();
}
catch(err) {
  console.warn(err)
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы