try catch 为什么不能捕获到promise构造函数 里的错误?

如下两种 都捕获不到,为什么?

function main1() {
  try {
    new Promise(() => {
      throw new Error('promise1 error')
    })
  } catch(e) {
    console.log(e.message);
  }
}

function main2() {
  try {
    Promise.reject('promise2 error');
  } catch(e) {
    console.log(e.message);
  }
}
阅读 3k
3 个回答

promise 内部 已经加了 try catch 处理了异常,所以不能冒泡到外面。

new Promise(() => {
    throw new Error('promise1 error')
})
// 可以理解成这样   Promise 构造函数 接受一个函数入参
// 他会自动把这个函数 给 try  catch 包裹起来 报错了 就会
// return Promise.reject('error') 所以你 try 是拿不到异常的
// 已经被处理过了
new Promise(() => {
    try {
        const a = () => {
            throw new Error('promise1 error')
        }
        return Promise.resolve(a)
    } catch (e) {
        return Promise.reject(e)
    }
})
async function main1() {
  try {
    await new Promise(() => {
      throw new Error('promise1 error')
    })
  } catch(e) {
    console.log(e.message);
  }
}

async function main2() {
  try {
    await Promise.reject('promise2 error');
  } catch(e) {
    console.log(e.message);
  }
}

需要async和await,至于为什么不加await和async就捕获不到,因为异常是间接的产生在Promise里的,而非产生在main1/main2里,就比如这个例子一样

function foo(){
  try{
    setTimeout(function(){
      throw new Error('error')
    },1000)
  } catch(e) {
    console.log(e)
  }
}

也是catch不到的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题