How can I override/extend ReferenceError in Chrome's JavaScript?

后端 未结 1 840
情书的邮戳
情书的邮戳 2021-02-04 07:29

To make debugging easier, I\'m capturing all of the console logs in Chrome so that users who submit a feedback entry will also submit all of the logs to our server. When someon

1条回答
  •  梦谈多话
    2021-02-04 07:58

    I have done quite a bit of research for the same reason: I wanted to log errors and report them.

    "Overriding" a native type (whether ReferenceError, String, or Array) is not possible.

    Chrome binds these before any Javascript is run, so redefining window.ReferenceError has no effect.

    You can extend ReferenceError with something like ReferenceError.prototype.extension = function() { return 0; }, or even override toString (for consistency, try it on the page, not the Dev Tools).

    That doesn't help you much.

    But not to worry....

    (1) Use window.onerror to get file name, 1-indexed line number, and 0-indexed position of uncaught errors, as well as the error itself.

    var errorData = [];
    onerror = function(message, file, line, position, error) {
        errorData.push({message:message, file:file, line:line, position:position, error:error});
    };
    

    See the fiddle for an example. Since the OP was Chrome-specific, this has only been tested to work in Chrome.

    (2) Because of improvements to (1), this is no longer necessary, but I leave this second technique here for completeness, and since onerror is not guaranteed to work for all errors on all browsers. You will also sometimes see the following:

    var errors = [];
    function protectedFunction(f) {
        return function() {
            try {
                f.apply(this, arguments);
            } catch(e) {
                errors.push(e);
                throw e;
            }
        };
    }
    setTimeout = protectedFunction(setTimeout);
    setInterval = protectedFunction(setInterval);
    etc...
    

    FYI, all this is very similar to what has been done in the Google Closure Compiler library, in goog.debug, created during Gmail development with the intent of doing exactly this. Of particular interest is goog.debug.ErrorHandler and goog.debug.ErrorReporter.

    0 讨论(0)
提交回复
热议问题