Chrome extension: comment piéger/Gérer les erreurs de contenu-script globalement?

dans une extension Chrome, y a-t-il un moyen de piéger/gérer globalement les erreurs Javascript se produisant dans un script de contenu? (par exemple pour la présentation d'une erreur Javascript service de suivi comme bugsnag)

Idéalement, je voudrais configurer un mondial window.onerror handler en haut du script de contenu. Mais cela ne fonctionne pas correctement dans Chrome 40: l'erreur est attrapée, mais les informations fournies sont inutiles: un message d '"erreur de Script" et pas d'url, de nombre de lignes, de colonne ou d'objet d'erreur avec pile.

j'ai créé une extension de test pour montrer ce comportement pour les scripts de contenu. Les détails ci-dessous. Résultats intéressants:

reproduction d'une fenêtre cassée.onerror pour Chrome extension script de contenu.

Dans un nouveau dossier, créez manifest.json,content-script.js et background-script.js. Puis chargez dans Chrome via Window > Extensions > chargez L'Extension déballée.

  • voir la fenêtre cassée.onerror info pour une erreur de contenu-script, rechargez une page Web et regardez la console devtools

manifeste.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"]
    }]
}

content-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?');
31
demandé sur huczilla 2015-02-05 18:37:50

4 réponses

5 mois après avoir posé cette question, je suis maintenant assez convaincu qu'il n'y a pas actuellement un moyen facile de piéger/Gérer les erreurs Javascript se produisant dans un script de contenu. En tant que tel,

  • j'ai créé un rapport de bogue Chrome: la fenêtre.onerror devrait contenir des informations utiles pour les erreurs lancées dans le script de contenu d'extension. Hésitez pas à puce avec des commentaires utiles.
  • si vous avez besoin de piéger globalement les erreurs de script de contenu, votre meilleur pari est de supposer fenêtre.onerror est cassé pour l'instant dans les scripts de contenu. Au lieu de cela, enveloppez tout le code Javascript dans des blocs try-catch, ce qui vous donne accès à des informations d'erreur utiles. C'est plus compliqué qu'il n'y paraît, car vous devez gérer à la fois le code synchrone (facile) et le code de rappel asynchrone (plus compliqué). Jetez un oeil à cette article pour commencer, et bonne chance!
17
répondu huczilla 2015-07-03 21:27:27

découvrez TraceKit, c'est ce que nous utilisons dans notre entreprise pour faire toute la journalisation d'erreur front-end. Si vous le combinez avec une bibliothèque client javascript pour votre service de journalisation préféré, vous êtes prêt.

-1
répondu Wim Mostmans 2015-04-14 19:35:21

je sais que je suis un peu en retard pour ce (un peu plus d'un an), mais je voulais obtenir une réponse possible. Il y a deux façons principales de le faire.

La première méthode est un sous-ensemble de l' chrome.extension API. chrome.extension.lastError saisit les erreurs, et place le message / résumé dans la chaîne chrome.extension.lastError.message. Malheureusement, c'est à peu près tout ce qu'il peut faire, vous pouvez vérifier dans le Chrome Developer documentation.

la seconde méthode, utilisant des écouteurs d'événements, est window.addEventListener('error', function(e) { ... });, où l'événement e pris par le callback stocke la trace de l'erreur dans la pile à e.error.stack. Ceci peut être utilisé indépendamment ou en conjonction avec la première méthode, et vous pouvez lire à ce sujet ici.

-1
répondu andrewgu 2015-04-27 15:54:05

voir le traitement des erreurs le plus complet par Chrome extension content script dans https://github.com/barbushin/javascript-errors-notifier/blob/master/content.js - c'est le code source de Les Erreurs JavaScript Déclarant extension.

-1
répondu barbushin 2016-04-05 07:56:26