try/catch和Promise.catch捕捉错误的区别

287 阅读1分钟

trycatch:同步任务使用trycatch包裹,抛出错误后,并不影响后续逻辑代码的执行

console.log(99995);
try {
  throw Error('出错了')
} catch (err) {
  console.log(99996, err);
}
console.log(99997);

promise抛出错误后并不会影响后续同步任务的执行

console.log(99995);
Promise.reject(Error('出错了'))
console.log(99997);

promise抛出错误后可以由.catch捕捉到

new Promise((resolve, reject) => {
  console.log('同步任务开始,99980');
  reject(Error('出错了,99982'))
}).catch(err => {
  console.log(err, 99984);
})

trycatch捕捉不到异步任务抛出的错误,promise

try {
  new Promise((resolve, reject) => {
    console.log('同步任务开始,99980');
    reject(Error('出错了,99982'))
  })
} catch (error) {
  console.log(error, 99983);
}

trycatch也捕捉不到async抛出的错误

async function test() {
  throw Error('出错了')
}
try {
  console.log(999980);
  test()
  console.log(999981);
} catch (error) {
  console.log(error, 999982);
}
console.log(999983);

trycatch可以捕捉到async和await抛出的错误

async function test() {
  throw Error('出错了')
}
try {
  console.log(999980);
  await test()
  console.log(999981);
} catch (error) {
  console.log(error, 999982);
}
console.log(999983);

总结

try catch可以捕捉同步任务抛出的错误 promise的catch可以捕捉异步任务抛出的错误 async关键字声明异步函数,在经过await处理后,抛出的错误可以被trycatch捕捉到