error cause 为 Error 构造器引入了第二个参数,该参数是一个带有 cause
属性的对象,可以携带底层错误的信息,而上层错误的信息由 Error 构造器的第一个参数提供。error cause 有助于进行错误链的跟踪,保留抛出错误的上下文信息。
举个例子,以前的错误处理可能是这样的:
// 方式一:很难分离出底层错误信息和自定义错误信息
function fetchData(url){
return fetch(url).catch(err => {
throw new Error(`can't fetch data from ${url}`,err)
})
}
(async function(){
try {
await fetchData('x:x')
} catch(e) {
console.log(e)
}
})()
// 方式二:需要对错误进行二次包裹
function fetchData(url){
return fetch(url).catch(err => {
const e = new Error(`can't fetch data from ${url}`)
e.cause = err
return e
})
}
(async function(){
try {
await fetchData('x:x')
} catch(e) {
console.log(e)
console.log('Cause by',e.cause)
}
})()
但使用了 error cause 之后,是这样的:
function fetchData(url){
return fetch(url).catch(err => {
throw new Error(`can't fetch data from ${url}`,{cause:err})
})
}
(async function(){
try {
await fetchData('x:x')
} catch(e) {
console.log(e)
console.log('Cause by',e.cause)
}
})()
传给 Error 构造器的第一个参数是用户自定义的上层错误信息,基于此会产生一个 error 实例,该实例作为参数会传递给 catch
块;而第二个参数的 cause
属性会挂载到 error 实例,可以将底层错误信息携带上去。