javascript - Chrome 扩展 - 如何捕获所有运行时异常

标签 javascript google-chrome google-chrome-extension

我正在开发一个 Chrome 扩展程序,它的 background script (或 event script )它连续运行并检测是否在任何选项卡中访问了某些网页,然后进行一些处理。

我注意到该脚本时不时地随机停止工作,但如果我重新启动浏览器或检查控制台中的后台脚本,该脚本会再次启动。

我知道如何在 chrome.storage.local 中存储数据,并且我希望能够在每次抛出运行时错误时进行检测并进行输入,这可能吗?即脚本范围的 catch block ?

我看到了this post它解释了如何处理运行时错误,但这仅适用于单个回调函数。我希望能够对整个脚本执行此操作。

最佳答案

您可能正在执行空闲卸载 Event pages使用(因为你说检查工作 - 这会唤醒它)。

您可以选择输入"persistent": false,然后comes with consequences .

如果您依赖任何状态变量,它们将在页面卸载时丢失。如果您必须保留任何状态,请在 chrome.storage.local 中进行。

另一个常见错误是每次脚本运行时没有重新注册所有事件监听器。 unload-but-remember-listeners 机制依赖于它;如果触发事件,则会发生以下情况:

  1. 检查是否有为该事件注册的监听器。如果没有,则什么也不做。
  2. 如果存在,则监听器本身不再存在(JS 上下文已卸载)。执行页面以重建上下文。
  3. 页面停止执行后(不管异步代码,Chrome 都不会等待),选择在此运行中注册的与事件匹配的监听器并执行它。

因此,如果您在代码路径中注册了一个监听器,该监听器并非每次运行脚本时都执行(例如,不是在顶级语句中,而是有条件或异步地),那么在唤醒脚本后,该监听器将不会执行启用监听器并且事件将被删除:

/* Chrome wakes up your page */

chrome.storage.local.get("option", function(data) {
  if(data.option) {
    // Asynchronous
    chrome.someAPI.onSomeEvent.addListener(function() {
      // This will not be handled after unload
    });
  }
});

// Synchronous
chrome.someAPI.onSomeEvent.addListener(function() {
  // This will be handled after unload
  chrome.storage.local.get("option", function(data) {
    if(data.option) {
      // Do stuff
    });
  }
});

/* At this point, Chrome triggers the event,
   and if there are no listeners (re)registered it's lost */

因此,将任何条件/异步处理放入监听器中。

还有其他原因导致它停止工作,但如果不查看代码就无法判断。

关于javascript - Chrome 扩展 - 如何捕获所有运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226181/

相关文章:

javascript - Ng-click - 调用多个方法时顺序是否重要?

php - 如何根据浏览器语言重定向用户

javascript - 我的 jquery 窗口滚动停止工作

javascript - Google Chrome 扩展中的 SOCKS5 代理身份验证

javascript - 当用户选择不同的选项卡时,Chrome 中是否会触发事件?

javascript - 获取 HTML 表单之外的值

javascript - 在 Angularjs 中,嵌套在指令中的 Controller 可以设置指令的 ng-model 吗?

javascript - 根据另一个下拉列表更新下拉值 - jQuery

javascript - 如何通过javascript跨域?

javascript - Chrome javascript 绑定(bind)函数不一致