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