作者:阮一峰
本文仅用于学习记录,不存在任何商业用途,如侵删
ES2021 标准之中,为了配合新增的Promise.any()方法,还引入一个新的错误对象AggregateError,也放在这一章介绍。
AggregateError 在一个错误对象里面,封装了多个错误。如果某个单一操作,同时引发了多个错误,需要同时抛出这些错误,那么就可以抛出一个 AggregateError 错误对象,把各种错误都放在这个对象里面。
AggregateError 本身是一个构造函数,用来生成 AggregateError 实例对象。
AggregateError(errors[, message])
AggregateError()构造函数可以接受两个参数。
const error = new AggregateError([
new Error('ERROR_11112'),
new TypeError('First name must be a string'),
new RangeError('Transaction value must be at least 1'),
new URIError('User profile link must be https'),
], 'Transaction cannot be processed')
上面示例中,AggregateError()的第一个参数数组里面,一共有四个错误实例。第二个参数字符串则是这四个错误的一个整体的提示。
AggregateError的实例对象有三个属性。
下面是一个示例。
try {
throw new AggregateError([
new Error("some error"),
], 'Hello');
} catch (e) {
console.log(e instanceof AggregateError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "AggregateError"
console.log(e.errors); // [ Error: "some error" ]
}

Error 对象用来表示代码运行时的异常情况,但是从这个对象拿到的上下文信息,有时很难解读,也不够充分。
ES2022 为 Error 对象添加了一个cause属性,可以在生成错误时,添加报错原因的描述。
它的用法是new Error()生成 Error 实例时,给出一个描述对象,该对象可以设置cause属性。
const actual = new Error('an error!', { cause: 'Error cause' });
actual.cause; // 'Error cause'

上面示例中,生成 Error 实例时,使用描述对象给出cause属性,写入报错的原因。然后,就可以从实例对象上读取这个属性。
casue属性可以放置任意内容,不必一定是字符串。
try {
maybeWorks();
} catch (err) {
throw new Error('maybeWorks failed!', { cause: err });
}
上面示例中,cause属性放置的就是一个对象。