Chrome扩展程序:如何在全局范围内捕获/处理内容脚本错误?

时间:2015-02-05 15:37:51

标签: javascript google-chrome google-chrome-extension

在Chrome扩展程序中,有没有办法全局捕获/处理内容脚本中发生的Javascript错误?(例如,提交到bugsnag等Javascript错误跟踪服务)

理想情况下,我会在内容脚本的顶部设置一个全局window.onerror处理程序。但它在Chrome 40中无法正常工作:错误被捕获,但所提供的信息毫无用处:“脚本错误消息”#39;并且没有带有堆栈的url,lineNumber,列或错误对象。

我创建了一个测试扩展,以显示内容脚本的这种破坏行为。详情如下。有趣的发现:

为Chrome扩展程序内容脚本重现已破坏的window.onerror。

在新文件夹中,创建manifest.jsoncontent-script.jsbackground-script.js。然后通过Window加载到Chrome>扩展程序>加载解压扩展。

  • 要查看内容脚本错误的已破坏window.onerror信息,请重新加载网页并查看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?');

背景的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?');

4 个答案:

答案 0 :(得分:21)

在提出这个问题5个月后,我现在相信目前还没有一种简单的方法可以解决全局陷阱/处理内容脚本中发生的Javascript错误。因此,

  • 我创建了一个Chrome错误报告:window.onerror should contain useful info for thrown error in extension content script。请随意填写有用的评论。
  • 如果您需要全局捕获内容脚本错误,最好的办法是假设window.onerror现在已在内容脚本中被破坏。相反,将所有Javascript代码包装在try-catch块中,这样您就可以访问有用的错误信息。这比听起来更棘手,因为你必须处理同步代码(简单)和异步回调代码(棘手)。首先看一下这个article,祝你好运!

答案 1 :(得分:-1)

查看TraceKit,这就是我们在公司使用的所有前端错误记录。如果您将它与javascript客户端库结合使用,那么您可以设置自己喜欢的日志服务。

答案 2 :(得分:-1)

我知道我有点迟到(仅仅一年多),但仍然希望得到一个可能的答案。有两种主要方法可以做到这一点。

第一种方法是chrome.extension API的子集。 chrome.extension.lastError捕获错误,并将消息/摘要设置为字符串chrome.extension.lastError.message。不幸的是,这几乎可以做到,你可以在Chrome Developer's documentation中查看。

使用事件侦听器的第二种方法是window.addEventListener('error', function(e) { ... });,其中回调所采用的事件e将错误的堆栈跟踪存储到e.error.stack。这可以单独使用,也可以与第一种方法结合使用,您可以阅读here

答案 3 :(得分:-1)

https://github.com/barbushin/javascript-errors-notifier/blob/master/content.js中查看Chrome扩展程序内容脚本处理的最完整错误 - 它的JavaScript Errors Notifier扩展程序的源代码。