intern-study icon indicating copy to clipboard operation
intern-study copied to clipboard

promise的错误捕获

Open deligent-ant opened this issue 6 years ago • 0 comments

promise的错误捕获

起源于一个问题:promise的错误能不能被外层的try catch捕获?

主要关键点:
  • try catch是同步捕获错误的
  • promise异步执行,microwork的一种
  • await 可以捕获错误
  • promise自带的catch方法
  • await与try catch
问题的导入:
try{
Promoise.reject('我就是要报错!')
}catch(err){console.log(err)}

try{
await Promoise.reject('我就是要报错!')
}catch(err){console.log(err)}

第一个是没办法捕获到这个错误的,而第2个是可以的。


  • 第一个因为try catch是同步执行的,在promise还没状态改变时就已经运行完毕了,所以不能在捕获错误了。
  • 第二个 await后面加的一个promise会等待promise运行结果,有报错有catch这个错误,然后throw出来给外层。

promise自带的catch方法

catch 是 .then(null, rejection)的别名,用于指定发生错误时的回调函数。

  • 一旦catch前面的任何一个Promise发生异常,都会被catch捕获,包括Promise函数创建的Promise,还有.then返回的Promise,甚至catch前面如果还有一个catch在这个catch抛出的异常也会被后一个catch捕获。

所以常常见到下面这个写法:

promise.then().catch()
promise.then().then().catch()
promise.then().then().catch().then().catch()

await与try catch

async function tryPromise(){
await Promise.reject('错误')
await Promise.resolve('输出')
return
}
try{
await tryPromsie()}catch(err){
}

第一个await出错,错误给后面的catch。async函数直接结束,后面的await就不会执行。 如果想在第一个await出错时候,后面的await还执行,可以在第一个await外层套一个try catch。

后面再看看await是怎么处理错误的,后面在更新。

deligent-ant avatar Jul 11 '18 02:07 deligent-ant