Error: cause
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