IDBRequest: error 屬性

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

* 此特性的某些部分可能存在不同級別的支援。

注意:此功能在 Web Workers 中可用。

IDBRequest 介面的只讀屬性 error 在請求不成功時返回錯誤。

如果發生錯誤,則返回一個 DOMException 物件,否則返回 null。根據錯誤原因,異常物件將具有以下名稱之一。

這些錯誤是非同步的,這意味著它們無法透過 try...catch 進行處理。但是,如果為 IDBRequest 分配了 error 事件處理程式,您仍然可以透過事件物件的 error 屬性來檢查這些錯誤,例如 event.target.error.nameevent.target.error.message

AbortError

如果您中止了事務,那麼所有仍在進行中的請求都會收到此錯誤。

ConstraintError

當您在填充儲存區時插入不符合約束條件的資料時,會收到此錯誤。例如,如果您嘗試新增一個已存在於儲存區中的新鍵,您將收到此錯誤。

NotReadableError

對於無法恢復的讀取失敗錯誤,會收到此錯誤。具體來說,此錯誤表示記錄存在於資料庫中,但無法檢索其值。有關更多詳細資訊,請參閱下面的 瞬時和無法恢復的讀取錯誤

QuotaExceededError

當應用程式用盡磁碟配額時,會收到此錯誤。在某些情況下,瀏覽器會提示使用者分配更多空間,如果使用者拒絕請求,則會收到此錯誤。在其他情況下,瀏覽器會使用啟發式方法來確定是否可以分配更多空間。

UnknownError

對於瞬時讀取失敗錯誤(包括一般的磁碟 IO 錯誤)會收到此錯誤。有關更多詳細資訊,請參閱下面的 瞬時和無法恢復的讀取錯誤

VersionError

當您嘗試以低於資料庫現有版本的方式開啟資料庫時,會收到此錯誤。

瞬時和無法恢復的讀取錯誤

讀取錯誤發生在 IndexedDB 儲存了值,但隨後即使相關記錄仍然存在於資料庫中也無法讀取這些值的情況。

讀取錯誤可以分為兩種型別——瞬時無法恢復

瞬時讀取錯誤由 UnknownError 型別發出訊號,通常是由於記憶體不足引起的。對於小型資料庫,這通常不是問題。為了避免大型資料庫中的記憶體不足情況,請嘗試將資料庫訪問分塊,一次只加載您需要的記錄,例如使用與使用者搜尋查詢或分頁機制相關的特定 鍵範圍。如果遇到記憶體不足錯誤,可能會要求使用者關閉其他應用程式以在作業系統級別釋放空間。

無法恢復的讀取錯誤由 NotReadableError 型別發出訊號,是由原始檔被刪除引起的。

例如,一些瀏覽器將大型值(例如,用於離線播客應用程式的音訊檔案 blob)儲存為單獨的檔案,並透過資料庫中儲存的引用進行訪問。據觀察,這些單獨的檔案可能會被刪除,因為當用戶在使用磁碟空間恢復程式時,它們對使用者來說顯示為不透明檔案,導致下次訪問 IndexedDB 時出現無法恢復的讀取錯誤。

對於無法恢復的讀取錯誤,可能的糾正措施包括通知使用者,從資料庫中刪除該條目,然後嘗試從伺服器重新獲取資料。

異常

InvalidStateError DOMException

嘗試訪問該屬性時丟擲,因為請求尚未完成,因此錯誤不可用。

示例

以下示例請求一個給定的記錄標題,onsuccess 會從 IDBObjectStore 獲取相關記錄(可透過 objectStoreTitleRequest.result 訪問),更新記錄的一個屬性,然後將更新後的記錄放回物件儲存區。底部還包含一個 onerror 函式,如果請求失敗,它會報告錯誤是什麼。完整的可工作示例,請參閱我們的 To-do Notifications 應用(即時檢視示例)。

js
const title = "Walk dog";

// Open up a transaction as usual
const objectStore = db
  .transaction(["toDoList"], "readwrite")
  .objectStore("toDoList");

// Get the to-do list with the specified title
const objectStoreTitleRequest = objectStore.get(title);

objectStoreTitleRequest.onsuccess = () => {
  // Grab the data object returned as the result
  const data = objectStoreTitleRequest.result;

  // Update the notified value in the object to "yes"
  data.notified = "yes";

  // Create another request that inserts the item
  // back into the database
  const updateTitleRequest = objectStore.put(data);

  // When this new request succeeds, run the displayData()
  // function again to update the display
  updateTitleRequest.onsuccess = () => {
    displayData();
  };
};

objectStoreTitleRequest.onerror = () => {
  // If an error occurs with the request, log what it is
  console.log(
    `There has been an error with retrieving your data:
    ${objectStoreTitleRequest.error.name}: ${objectStoreTitleRequest.error.message}`,
  );
};

規範

規範
Indexed Database API 3.0
# ref-for-dom-idbrequest-error①

瀏覽器相容性

另見