2015-07-05 61 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 */ 

因此,將任何條件/異步處理放入偵聽器中。

爲什麼它可以停止工作還有其他一些原因,但沒有看到您的代碼是不可能分辨的。

相關問題