值
如果發生錯誤,則返回一個 DOMException 物件,否則返回 null。根據錯誤原因,異常物件將具有以下名稱之一。
這些錯誤是非同步的,這意味著它們無法透過 try...catch 進行處理。但是,如果為 IDBRequest 分配了 error 事件處理程式,您仍然可以透過事件物件的 error 屬性來檢查這些錯誤,例如 event.target.error.name 或 event.target.error.message。
AbortError-
如果您中止了事務,那麼所有仍在進行中的請求都會收到此錯誤。
ConstraintError-
當您在填充儲存區時插入不符合約束條件的資料時,會收到此錯誤。例如,如果您嘗試新增一個已存在於儲存區中的新鍵,您將收到此錯誤。
NotReadableError-
對於無法恢復的讀取失敗錯誤,會收到此錯誤。具體來說,此錯誤表示記錄存在於資料庫中,但無法檢索其值。有關更多詳細資訊,請參閱下面的 瞬時和無法恢復的讀取錯誤。
QuotaExceededError-
當應用程式用盡磁碟配額時,會收到此錯誤。在某些情況下,瀏覽器會提示使用者分配更多空間,如果使用者拒絕請求,則會收到此錯誤。在其他情況下,瀏覽器會使用啟發式方法來確定是否可以分配更多空間。
UnknownError-
對於瞬時讀取失敗錯誤(包括一般的磁碟 IO 錯誤)會收到此錯誤。有關更多詳細資訊,請參閱下面的 瞬時和無法恢復的讀取錯誤。
VersionError-
當您嘗試以低於資料庫現有版本的方式開啟資料庫時,會收到此錯誤。
瞬時和無法恢復的讀取錯誤
讀取錯誤發生在 IndexedDB 儲存了值,但隨後即使相關記錄仍然存在於資料庫中也無法讀取這些值的情況。
讀取錯誤可以分為兩種型別——瞬時或無法恢復
瞬時讀取錯誤由 UnknownError 型別發出訊號,通常是由於記憶體不足引起的。對於小型資料庫,這通常不是問題。為了避免大型資料庫中的記憶體不足情況,請嘗試將資料庫訪問分塊,一次只加載您需要的記錄,例如使用與使用者搜尋查詢或分頁機制相關的特定 鍵範圍。如果遇到記憶體不足錯誤,可能會要求使用者關閉其他應用程式以在作業系統級別釋放空間。
無法恢復的讀取錯誤由 NotReadableError 型別發出訊號,是由原始檔被刪除引起的。
例如,一些瀏覽器將大型值(例如,用於離線播客應用程式的音訊檔案 blob)儲存為單獨的檔案,並透過資料庫中儲存的引用進行訪問。據觀察,這些單獨的檔案可能會被刪除,因為當用戶在使用磁碟空間恢復程式時,它們對使用者來說顯示為不透明檔案,導致下次訪問 IndexedDB 時出現無法恢復的讀取錯誤。
對於無法恢復的讀取錯誤,可能的糾正措施包括通知使用者,從資料庫中刪除該條目,然後嘗試從伺服器重新獲取資料。
異常
InvalidStateErrorDOMException-
嘗試訪問該屬性時丟擲,因為請求尚未完成,因此錯誤不可用。
示例
以下示例請求一個給定的記錄標題,onsuccess 會從 IDBObjectStore 獲取相關記錄(可透過 objectStoreTitleRequest.result 訪問),更新記錄的一個屬性,然後將更新後的記錄放回物件儲存區。底部還包含一個 onerror 函式,如果請求失敗,它會報告錯誤是什麼。完整的可工作示例,請參閱我們的 To-do Notifications 應用(即時檢視示例)。
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① |
瀏覽器相容性
載入中…
另見
- 使用 IndexedDB
- 開始事務:
IDBDatabase - 使用事務:
IDBTransaction - 設定鍵的範圍:
IDBKeyRange - 檢索和修改資料:
IDBObjectStore - 使用遊標:
IDBCursor - 參考示例:待辦事項通知(檢視即時示例)。