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

时间:2015-07-05 00:17:53

标签: javascript google-chrome google-chrome-extension

我正在开发一个Chrome扩展程序,其background script(或event script)会持续运行并检测是否在任何标签页中访问了某些网页,然后进行了一些处理。

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

我知道如何在chrome.storage.local中存储数据,我希望每次抛出运行时错误时都能检测并创建一个条目,这可能吗?即一个脚本宽的捕获块?

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

1 个答案:

答案 0 :(得分:1)

您可能正在使用Event pages使用的空闲卸载(因为您说检查工作 - 将其唤醒)。

您可以选择加入"persistent": falsecomes with consequences

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

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

  1. 检查是否有任何听众注册了该活动。如果没有,什么也不做。
  2. 如果有,则监听器本身不再存在(卸载JS上下文)。执行页面以重建上下文。
  3. 页面停止执行后(忽略异步代码,Chrome不会等待),选择与此事件匹配的已运行的侦听器并执行它。
  4. 因此,如果您在代码路径中注册了一个侦听器,该代码路径在每次运行脚本时都没有执行(例如,不是在顶级语句中而是有条件地或异步地执行),那么在唤醒脚本后赢得&启用该侦听器并删除该事件:

    /* 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 */
    

    所以在侦听器中放置任何条件/异步处理。

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