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

huc*_*lla 33 javascript google-chrome google-chrome-extension

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

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

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

  • window.onerror 在后台脚本中正常工作,具有完整的错误信息
  • window.onerror在托管网页上也可以看到扩展内容脚本抛出的错误(但错误也不包含任何有用的信息)

为Chrome扩展程序内容脚本重新生成已破坏的window.onerror.

在一个新的文件夹,创建manifest.json,content-script.jsbackground-script.js.然后通过Window> Extensions> Load unpacked Extension加载到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"]
    }]
}
Run Code Online (Sandbox Code Playgroud)

内容的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?');
Run Code Online (Sandbox Code Playgroud)

背景的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?');
Run Code Online (Sandbox Code Playgroud)

huc*_*lla 24

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

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