intern-study
intern-study copied to clipboard
promise的错误捕获
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是怎么处理错误的,后面在更新。