Javascript Chrome扩展:如何全局捕获/处理内容脚本错误?
在Chrome扩展中,是否有办法全局捕获/处理内容脚本中发生的Javascript错误?(例如,提交给bugsnag之类的Javascript错误跟踪服务) 理想情况下,我会在内容脚本的顶部设置一个全局Javascript Chrome扩展:如何全局捕获/处理内容脚本错误?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,在Chrome扩展中,是否有办法全局捕获/处理内容脚本中发生的Javascript错误?(例如,提交给bugsnag之类的Javascript错误跟踪服务) 理想情况下,我会在内容脚本的顶部设置一个全局窗口.onerror处理程序。但它在Chrome40中无法正常工作:错误被捕获,但提供的信息是无用的:一条“脚本错误”消息,没有url、行号、列或带有堆栈的错误对象 我创建了一个测试扩展来显示内容脚本的这种破坏行为。详情如下。有趣的发现: window.onerror在后台脚本中正常工作,包含完
窗口.onerror
处理程序。但它在Chrome40中无法正常工作:错误被捕获,但提供的信息是无用的:一条“脚本错误”消息,没有url、行号、列或带有堆栈的错误对象
我创建了一个测试扩展来显示内容脚本的这种破坏行为。详情如下。有趣的发现:
在后台脚本中正常工作,包含完整的错误信息window.onerror
- 托管网页上的
也可以(但错误也不包含任何有用的信息)window.onerror
manifest.json
、content script.js
和background script.js
。然后通过窗口>扩展>加载未打包的扩展加载到Chrome中
- 要查看内容脚本错误的损坏window.onerror信息,请重新加载网页并查看devtools控制台
看看,这就是我们公司用来做所有前端错误记录的东西。如果你将它与你最喜欢的日志服务的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块中,这样可以访问有用的错误信息。这比听起来更复杂,因为您必须同时处理同步代码(简单)和异步回调代码(更复杂)。首先看看这个,祝你好运李>
错误事件。@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?');