Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome扩展:如何全局捕获/处理内容脚本错误?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript Chrome扩展:如何全局捕获/处理内容脚本错误?

Javascript Chrome扩展:如何全局捕获/处理内容脚本错误?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,在Chrome扩展中,是否有办法全局捕获/处理内容脚本中发生的Javascript错误?(例如,提交给bugsnag之类的Javascript错误跟踪服务) 理想情况下,我会在内容脚本的顶部设置一个全局窗口.onerror处理程序。但它在Chrome40中无法正常工作:错误被捕获,但提供的信息是无用的:一条“脚本错误”消息,没有url、行号、列或带有堆栈的错误对象 我创建了一个测试扩展来显示内容脚本的这种破坏行为。详情如下。有趣的发现: window.onerror在后台脚本中正常工作,包含完

在Chrome扩展中,是否有办法全局捕获/处理内容脚本中发生的Javascript错误?(例如,提交给bugsnag之类的Javascript错误跟踪服务)

理想情况下,我会在内容脚本的顶部设置一个全局
窗口.onerror
处理程序。但它在Chrome40中无法正常工作:错误被捕获,但提供的信息是无用的:一条“脚本错误”消息,没有url、行号、列或带有堆栈的错误对象

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

  • window.onerror
    在后台脚本中正常工作,包含完整的错误信息
  • 托管网页上的
    window.onerror
    也可以(但错误也不包含任何有用的信息)
正在为Chrome扩展内容脚本复制损坏的window.onerror。 在新文件夹中,创建
manifest.json
content script.js
background script.js
。然后通过窗口>扩展>加载未打包的扩展加载到Chrome中

  • 要查看内容脚本错误的损坏window.onerror信息,请重新加载网页并查看devtools控制台
manifest.json background-script.js
看看,这就是我们公司用来做所有前端错误记录的东西。如果你将它与你最喜欢的日志服务的javascript客户端库结合起来,那么一切都准备好了。

我知道我做这件事有点晚了(刚刚超过一年),但我仍然想得到一个可能的答案。有两种主要方法可以做到这一点

第一种方法是
chrome.extension
API的子集
chrome.extension.lastError
捕获错误,并将消息/摘要设置为字符串
chrome.extension.lastError.message
。不幸的是,这几乎是它所能做的,你可以在网上查看


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

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

  • 我已经创建了一个Chrome错误报告:。请随意插入有用的评论
  • 如果您需要全局捕获内容脚本错误,最好的办法是假设window.onerror在内容脚本中暂时失效。相反,将所有Javascript代码包装在try-catch块中,这样可以访问有用的错误信息。这比听起来更复杂,因为您必须同时处理同步代码(简单)和异步回调代码(更复杂)。首先看看这个,祝你好运
查看Chrome扩展内容脚本在-其扩展源代码中处理的最完整错误。

在修复Chrome错误之前,以下是一种在网页上下文中捕获错误的方法。不过,您必须确定错误是来自页面还是来自内容脚本。我已经尝试过所描述的方法,但它对我不起作用。宿主网页中的window.onerror确实捕获了从扩展内容脚本抛出的错误。但是提供的errorEvent也没有任何有用的信息。我看到:`{“message”:“scripterror.”,“filename”:“lineno”:0,“colno”:0,“error”:null}`@huczilla你能把你的“update”编辑出来并作为答案发布吗?这个问题处于一种没有肯定答案的不健康状态,而你的答案几乎是正确的。@Xan按要求完成了。你详细阅读了这个问题吗?具体地说,是指。OP很清楚
错误
事件。@Xan-Oh。我第一次并没有意识到这一点。谢谢我稍后会修改。享受你的宣传,这是当之无愧的。这仍然是一个问题吗?我注意到bug报告仍然打开,但当我在内容脚本的顶部放置一个
窗口.onerror
时,控制台会记录完整的错误响应。我收到一条消息,行号,堆栈跟踪,所有你想要的东西
{
    "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"]
    }]
}
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?');
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?');