1

我注意到在 chrome.tabs 调用中的回调中发生的错误不会报告滚动条项目。例如,不会报告以下错误:

chrome.tabs.getCurrent(function(currentTab) {
    throw "This is critical";
});

如果该throw语句在 chrome.tabs 回调之外,它会按预期报告给 rollbar。

无论它发生在后台脚本中,还是通过chrome-extension://url 访问的扩展页面中,行为都是相同的。

有没有一种解决方案可以让 rollbar 跟踪这些回调中的错误?

chrome API 回调中抛出的错误,似乎没有被onerror侦听器捕获。这是来自 chromium 项目的相关讨论:https ://bugs.chromium.org/p/chromium/issues/detail?id=357568

4

1 回答 1

1

Chrome 本身在标签回调中的行为很奇怪,即使不使用 Rollbar。

这是我使用的测试代码:

chrome.tabs.getSelected(null, function(tab){
  console.log('tabs callback', window);
  throw 'Error in tab';
});

setTimeout(function(){
  console.log('timeout callback', window);
  throw 'Error in timeout';
}, 100);

对于超时回调,扩展程序的后台控制台和错误视图都显示了异常的正确代码位置。

但是,对于选项卡回调,位置显示为 _generated_background_page.html,在控制台和错误视图中都没有回溯或行号。Chrome 本身似乎并不知道更多关于错误的来源。

两个回调中的窗口对象确实将onerror钩子正确设置为 Rollbar 的处理程序。但是在选项卡示例中,它永远不会被调用。Chrome 似乎在它到达onerror处理程序之前捕获了错误,或者任何类型的线程甚至不使用onerror处理程序。

作为一种解决方法,我尝试将代码包装在 try/catch 中,并向 Rollbar 报告:

chrome.tabs.getSelected(null, function(tab){
  try {
    console.log('tabs callback', window);
    throw 'Error in tab';
  }
  catch (e) {
    console.log('error', e);
    Rollbar.log(e);
  }
});

这可行,但错误对象仍将其位置报告为 _generated_background_page.html。至少它确实有正确的错误信息。

于 2019-04-16T22:06:32.047 回答