Chrome扩展程序:如何在全球范围内陷入/处理内容脚本错误? [英] Chrome extension: how to trap/handle content-script errors globally?
问题描述
理想情况下,我会在内容脚本的顶部设置一个全局 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应该包含扩展内容脚本中抛出错误的有用信息。欢迎随时使用有用的评论。
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:
window.onerror
works correctly in a background script, with full error informationwindow.onerror
on the hosting webpage can also see the error thrown by an extension content script (but the error doesn't contain any useful info either)
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屋!