Rollbar не обнаруживает ошибки в обратных вызовах chrome.tabs - PullRequest
1 голос
/ 05 апреля 2019

Я заметил, что элементы rollbar не сообщаются об ошибках, возникающих при обратном вызове в вызовах chrome.tabs.Например, следующая ошибка не будет сообщена:

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

Если оператор throw находится за пределами обратного вызова chrome.tabs, он попадает на роль баров, как и ожидалось.

Поведението же самое, независимо от того, происходит ли это в фоновом скрипте или на странице расширения, доступ к которой осуществляется через chrome-extension:// url.

Есть ли решение, которое позволит rollbar отслеживать ошибки в этих обратных вызовах?

Ошибки, выдаваемые в обратных вызовах API chrome, похоже, не распознаются слушателем onerror.Вот связанное обсуждение от проекта хрома: https://bugs.chromium.org/p/chromium/issues/detail?id=357568

1 Ответ

1 голос
/ 17 апреля 2019

Сам 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. По крайней мере, оно имеет правильное сообщение об ошибке.

...