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

Расширение Chrome: как перехватывать/обрабатывать контент-ошибки script глобально?

В расширении Chrome есть способ глобально ловушки/обработки ошибок Javascript, встречающихся в контенте script? (например, для отправки в службу отслеживания ошибок Javascript, например bugsnag)

В идеале я бы установил глобальный обработчик window.onerror в верхней части содержимого script. Но он не работает должным образом в Chrome 40: ошибка поймана, но предоставленная информация бесполезна: сообщение "Script error" и нет url, lineNumber, столбца или объекта ошибки со стеком.

Я создал тестовое расширение, чтобы показать это поведение с ошибками для скриптов контента. Подробности ниже. Интересные выводы:

Воспроизведение busted window.onerror для содержимого расширения Chrome script.

В новой папке создайте manifest.json, content-script.js и background-script.js. Затем загрузите в Chrome через Window > Extensions > Load unpacked Extension.

  • Чтобы просмотреть поврежденную информацию window.onerror для ошибки content- script, перезагрузите веб-страницу и посмотрите на консоль devtools.

manifest.json

{
    "name": "Chrome extension content-script errors test",
    "manifest_version": 2,
    "version": "0.0.1",
    "background": {
      "scripts": [ "background-script.js" ]
    },
    "content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["content-script.js"]
    }]
}

контент- script.js

window.onerror = function (errorMsg, url, lineNumber, column, errorObj) {
    console.log('Caught content script error');
    console.log('errorMsg: ' + errorMsg);
    console.log('url: ' + url);
    console.log('lineNumber: ' + column);
    console.log('column: ' + column);
    console.log('errorObj follows:');
    console.log(errorObj);
    return true;
};

console.log('I am a content script, about to throw an error');
throw new Error('Is this error caught?');

background- script.js

window.onerror = function (errorMsg, url, lineNumber, column, errorObj) {
    console.log('Caught background script error');
    console.log('errorMsg: ' + errorMsg);
    console.log('url: ' + url);
    console.log('lineNumber: ' + column);
    console.log('column: ' + column);
    console.log('errorObj follows:');
    console.log(errorObj);
    return true;
};

//To see nice window.onerror behaviour for background script..
//Uncomment 2 lines below, reload extension, and look at extension console
//console.log('I am a background script, about to throw an error');
//throw new Error('Is this error caught?');
4b9b3361

Ответ 1

Через 5 месяцев после запроса этого вопроса я теперь убедился, что в настоящее время нет простого способа глобальной ловушки/обработки ошибок Javascript, возникающих в контенте script. Таким образом,

  • Я создал отчет об ошибке в Chrome: window.onerror должен содержать полезную информацию о возникшей ошибке в содержимом расширения script. Не стесняйтесь получать полезные комментарии.
  • Если вам нужно глобально отловить содержимое script ошибок, лучше всего предположить, что window.onerror в настоящее время разоряется в сценариях контента. Вместо этого оберните весь код Javascript в блоки try-catch, что даст вам доступ к полезной информации об ошибках. Это сложнее, чем кажется, поскольку вам приходится обрабатывать как синхронный код (простой), так и асинхронный код обратного вызова (сложнее). Взгляните на эту статью для начала и удачи!

Ответ 2

Отъезд TraceKit, что мы используем в нашей компании, чтобы делать все входные ошибки регистрации ошибок. Если вы объедините его с клиентской библиотекой javascript для вашей любимой службы ведения журналов, вы все настроены.

Ответ 3

Я знаю, что я немного опаздываю на это (чуть больше года), но все же хотел получить возможный ответ. Существует два основных способа сделать это.

Первый метод - это подмножество API chrome.extension. chrome.extension.lastError улавливает ошибки и устанавливает сообщение/сводку в строку chrome.extension.lastError.message. К сожалению, это почти все, что он может сделать, вы можете проверить это в документации разработчика Chrome.

Второй метод, использующий прослушиватели событий, - это window.addEventListener('error', function(e) { ... });, где событие e, принятое обратным вызовом, сохраняет трассировку стека ошибки до e.error.stack. Это можно использовать независимо или в сочетании с первым методом, и вы можете прочитать об этом здесь.