Recherche…


Syntaxe

  • window.onerror = function (eventOrMessage, url, lineNumber, colNumber, erreur) {...}

Paramètres

Paramètre Détails
eventOrMessage Certains navigateurs appellent le gestionnaire d'événements avec un seul argument, un objet Event . Toutefois, les autres navigateurs, en particulier les plus anciens et les plus anciens, fourniront un message String en premier argument.
URL Si un gestionnaire est appelé avec plus d'un argument, le second argument est généralement l'URL d'un fichier JavaScript à l'origine du problème.
numéro de ligne Si un gestionnaire est appelé avec plus d'un argument, le troisième argument est un numéro de ligne dans le fichier source JavaScript.
colNumber Si un gestionnaire est appelé avec plus d'un argument, le quatrième argument est le numéro de colonne dans le fichier source JavaScript.
Erreur Si un gestionnaire est appelé avec plus d'un argument, le cinquième argument est parfois un objet Error décrivant le problème.

Remarques

Malheureusement, window.onerror a toujours été implémenté différemment par chaque fournisseur. Les informations fournies dans la section Paramètres sont une approximation de ce qu'il faut attendre de différents navigateurs et de leurs versions.

Gestion de window.onerror pour signaler toutes les erreurs sur le serveur

L'exemple suivant écoute l'événement window.onerror et utilise une technique de balise image pour envoyer les informations via les paramètres GET d'une URL.

var hasLoggedOnce = false;

// Some browsers (at least Firefox) don't report line and column numbers
// when event is handled through window.addEventListener('error', fn). That's why
// a more reliable approach is to set an event listener via direct assignment.
window.onerror = function (eventOrMessage, url, lineNumber, colNumber, error) {
    if (hasLoggedOnce || !eventOrMessage) {
        // It does not make sense to report an error if:
        // 1. another one has already been reported -- the page has an invalid state and may produce way too many errors.
        // 2. the provided information does not make sense (!eventOrMessage -- the browser didn't supply information for some reason.)
        return;
    }
    hasLoggedOnce = true;
    if (typeof eventOrMessage !== 'string') {
        error = eventOrMessage.error;
        url = eventOrMessage.filename || eventOrMessage.fileName;
        lineNumber = eventOrMessage.lineno || eventOrMessage.lineNumber;
        colNumber = eventOrMessage.colno || eventOrMessage.columnNumber;
        eventOrMessage = eventOrMessage.message || eventOrMessage.name || error.message || error.name;
    }
    if (error && error.stack) {
        eventOrMessage = [eventOrMessage, '; Stack: ', error.stack, '.'].join('');
    }
    var jsFile = (/[^/]+\.js/i.exec(url || '') || [])[0] || 'inlineScriptOrDynamicEvalCode',
        stack = [eventOrMessage, ' Occurred in ', jsFile, ':', lineNumber || '?', ':', colNumber || '?'].join('');

    // shortening the message a bit so that it is more likely to fit into browser's URL length limit (which is 2,083 in some browsers)
    stack = stack.replace(/https?\:\/\/[^/]+/gi, '');
    // calling the server-side handler which should probably register the error in a database or a log file
    new Image().src = '/exampleErrorReporting?stack=' + encodeURIComponent(stack);
    
    // window.DEBUG_ENVIRONMENT a configurable property that may be set to true somewhere else for debugging and testing purposes.
    if (window.DEBUG_ENVIRONMENT) {
        alert('Client-side script failed: ' + stack);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow