Error: cause
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2021.
Error
实例中的 cause
数据属性指示导致该错误的具体原始原因。
在捕获错误时,我们可能会使用更具体或更加实用的信息对错误进行包装,再将其重新抛出。cause
属性就用于这一场景,以便仍然可以访问原始的错误。
取值
它通过 options.cause
参数被传入 Error()
构造函数,并且有可能不存在。
Error: cause 的属性特性 |
|
---|---|
可写 | 是 |
可枚举 | 否 |
可配置 | 是 |
描述
cause
的值可以是任何类型。你不应该假设捕获错误的 cause
属性是一个 Error
,正如在 catch
语句中绑定的变量未必一定是 Error
。下文“将结构化的数据作为 cause”示例展示了刻意不提供 Error
作为 cause
的情况。
示例
重新抛出包含 cause 的错误
有时,捕获错误并使用新的错误信息将其重新抛出是很有用的。在这种情况下,你应该将原始错误传递给新的 Error
的构造函数,如下所示:
js
try {
connectToDatabase();
} catch (err) {
throw new Error("Connecting to database failed.", { cause: err });
}
更详细的示例请参阅错误 > 区分相似的错误。
将结构化的数据作为 cause
为开发者理解而编写的错误消息可能并不适合机器解析,因为它们会受到表达方式改变(rewording),或标点符号改变的影响,破坏已有解析器的正常使用。因此,当从函数中抛出错误时,你可以提供结构化的数据作为错误原因(即 cause
字段)供机器解析,以此替代人类可读的错误消息。
js
function makeRSA(p, q) {
if (!Number.isInteger(p) || !Number.isInteger(q)) {
throw new Error("RSA key generation requires integer inputs.", {
cause: { code: "NonInteger", values: [p, q] },
});
}
if (!areCoprime(p, q)) {
throw new Error("RSA key generation requires two co-prime integers.", {
cause: { code: "NonCoprime", values: [p, q] },
});
}
// rsa algorithm…
}
规范
Specification |
---|
ECMAScript Language Specification # sec-installerrorcause |
浏览器兼容性
BCD tables only load in the browser