Chrome扩展程序:如何在全球范围内陷入/处理内容脚本错误? [英] Chrome extension: how to trap/handle content-script errors globally?

查看:190
本文介绍了Chrome扩展程序:如何在全球范围内陷入/处理内容脚本错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Chrome扩展中,是否有一种方法可以全局捕获/处理内容脚本中发生的Javascript错误?(例如,提交给像bugsnag这样的Javascript错误跟踪服务)



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



我创建了一个测试扩展来显示内容脚本的这种错误行为。下面的细节。有趣的发现:


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


为Chrome扩展内容脚本重现已崩溃的window.onerror。



在新文件夹中, code> manifest.json , content-script.js background-script.js 。然后通过Window> Extensions> Load unpacked Extension加载到Chrome中。




  • 要查看内容脚本错误的window.onerror信息,重新加载网页并查看devtools控制台



manifest.json



 {
name:Chrome扩展内容脚本错误测试,
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如下:');
console.log(errorObj);
返回true;
};

console.log('我是一个内容脚本,即将发生错误');
抛出新错误('这个错误是否被捕获?');



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如下:');
console.log(errorObj);
返回true;
};

//查看后台脚本的很好的window.onerror行为..
//取消注释下面的2行,重新加载扩展,并查看扩展控制台
//console.log ('我是一个后台脚本,即将发生错误');
//抛出新的错误('这个错误是否被捕获?');


解决方案

相当有说服力,目前还没有一种简单的方法来全局陷阱/处理内容脚本中发生的Javascript错误。因此,我已经创建了Chrome报告错误报告: /chromium/issues/detail?id=457785\">window.onerror应该包含扩展内容脚本中抛出错误的有用信息。欢迎随时使用有用的评论。

  • 如果您需要全局捕获内容脚本错误,最好的办法是假设window.onerror现在在内容脚本中被破坏。相反,将所有Javascript代码封装在try-catch块中,这样可以访问有用的错误信息。这比听起来更复杂,因为你必须同时处理同步代码(简单)和异步回调代码(更复杂)。请参阅这篇文章,祝您好运!


  • In a Chrome extension, is there a way to globally trap/handle Javascript errors occurring in a content-script? (e.g. for submission to a Javascript error tracking service like bugsnag)

    Ideally, I would setup a global window.onerror handler at the top of the content script. But it's not working properly in Chrome 40: the error is caught, but the information supplied is useless: a message of 'Script error' and no url, lineNumber, column or error object with stack.

    I created a test extension to show this busted behaviour for content scripts. Details below. Interesting findings:

    Reproducing busted window.onerror for Chrome extension content script.

    In a new folder, create manifest.json, content-script.js and background-script.js. Then load into Chrome via Window > Extensions > Load unpacked Extension.

    • To see the busted window.onerror info for a content-script error, reload a webpage and look at the devtools console

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

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

    解决方案

    5 months after asking this question, I'm now pretty convinced there isn't currently an easy way to global trap/handle Javascript errors occurring in a content script. As such,

    • I've created a Chrome bug report: window.onerror should contain useful info for thrown error in extension content script. Feel free to chip in with useful comments.
    • If you need to globally trap content script errors, your best bet is to assume window.onerror is busted for now in content scripts. Instead, wrap all Javascript code in try-catch blocks, which gives you access to useful error information. This is trickier than it sounds, as you have to handle both synchronous code (easy) and asynchronous-callback code (trickier). Take a look at this article for starters, and good luck!

    这篇关于Chrome扩展程序:如何在全球范围内陷入/处理内容脚本错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆