2015-07-05 50 views
0

我正在使用Chrome扩展程序,该扩展程序有一个background script(或event script),它持续运行并检测某些网页是否在任何选项卡中访问过,然后执行一些处理。Chrome扩展程序 - 如何捕获所有运行时异常

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

我知道如何将数据存储在chrome.storage.local中,并且我希望能够在每次运行时发生错误时检测并输入条目,这可能吗?即脚本广泛的捕获块?

我看到了this post,它解释了如何处理运行时错误,但这只适用于单个回调函数。我希望能够为整个剧本做到这一点。

+0

用链接中显示的方式包装整个脚本? – Nit

+0

@Nit:但这只是一个'IF'声明 - 只会在某个时间点起作用。我可以使用try catch块并封装整个脚本,但这似乎很奇怪。这是一种标准做法吗? –

+0

不完全是您的问题的答案,但大多数时间延长失败,因为您没有处理互联网连接问题。 – mallik1055

回答

1

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

这是你的选择投入"persistent": false和它comes with consequences

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

另一个常见错误是每次脚本运行时都不会重新注册全部事件侦听器。卸载但记忆听众的机制取决于它;如果事件被触发,将发生以下事件:

  1. 检查它是否有任何听众注册了该事件。如果没有,什么都不要做。
  2. 如果存在,监听器本身不再存在(JS上下文被卸载)。执行页面重建上下文。
  3. 页面停止执行后(忽略异步代码,Chrome不会等待),请选择注册,该运行与事件匹配并执行它。

所以,如果你,说,注册的代码路径的监听器,这不是执行每次运行脚本时(例如未在顶级声明,但有条件或异步),然后醒来后的剧本获得了” t已经启用了该听众并且该事件将被丢弃:

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

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

为什么它可以停止工作还有其他一些原因,但没有看到您的代码是不可能分辨的。

相关问题