值
如果发生错误,则返回一个 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 - 参考示例:待办事项通知(查看实时示例)。