try/catch 和 Promise.catch 捕捉错误的异同及使用限制
相同点
都是用于处理
JavaScript
异常的机制
不同点
try/catch
只能捕获和处理同步代码中的异常,对于异步操作(比如网络请求)或Promise
内部的异常,try/catch
无法直接捕获。Promise
可用于处理异步操作的结果和错误。try/catch
不能捕获Promise
里reject
出来的错误信息。Promise
里reject
出来的错误信息,可用Promise.catch()
的方法来获取
try/catch 捕获不到错误的情况举例说明:
try/catch
捕获不到Promise
里reject
出来的错误信息try { Promise.reject('出错了'); } catch(e) { console.log(e) } // try/catch 未捕获到,浏览器直接报错:Uncaught (in promise) 出错了
try/catch
捕获不到异步的错误信息try { setTimeout(() => { console.log(a) }, 100) } catch (error) { console.log(error) } // try/catch 未捕获到,浏览器直接报错:Uncaught ReferenceError: a is not defined
Promise.catch捕获异步错误时,哪些可捕获到,哪些不可捕获到?
-
Promise.catch
捕获不到报错的情况- 第一种情况:
new Promise
时的异步代码无法捕获。new Promise((resolve, reject) => { setTimeout(() => { console.log(a) }, 100) }).catch(error => { console.log(error) }) // Promise.catch未捕获到,浏览器直接报错:Uncaught ReferenceError: a is not defined
- 第二种情况:
new Promise
时的异步代码即使调用reject也无法捕获。new Promise((resolve, reject) => { setTimeout(() => { reject(a) }, 100) }).catch(error => { console.log(error) }) // Promise.catch未捕获到,浏览器直接报错:Uncaught ReferenceError: a is not defined
- 第三种情况:
Promise.then
中的异步代码无法捕获。new Promise((resolve, reject) => { setTimeout(() => { resolve() }, 100) }).then(res=> { setTimeout(()=>console.log(a) ) }).catch(err => { console.log(err) }) // Promise.catch未捕获到,浏览器直接报错:Uncaught ReferenceError: a is not defined
- 第一种情况:
-
Promise.catch
可捕获到异步报错的情况:
new Promise
时有异步代码,但是代码调用了reject
且未报错,就可直接被catch
捕获。new Promise((resolve, reject) => { setTimeout(() => { reject(1) }, 100) }).catch(error => { console.log(error) }) // Promise.catch已捕获到,
注意:try/catch
捕获的代码错误,这个代码必须是在try
线程里的时候才能捕获到。而如果是异步函数,异步函数会进入队列,这个时候代码已经离开try
的这个主线程,所以try/catch
是捕获不到异步代码的错误的。