Расширение 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?');
Ответы
Ответ 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
. Это можно использовать независимо или в сочетании с первым методом, и вы можете прочитать об этом здесь.
Ответ 4
Посмотрите самую полную обработку ошибок с помощью содержимого расширения Chrome script в https://github.com/barbushin/javascript-errors-notifier/blob/master/content.js - это исходный код Расширение JavaScript Ошибки.