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①

浏览器兼容性

另见