promise 未捕获错误的两个问题
来源:7-14 如何统一监听React组件报错
内六角
2022-04-01
window.onerror = function(a, b, c) {
console.log('最外层的错误====', a, b, c);
}
window.onunhandledrejection = function(a, b, c) {
console.log('最外层的错误==3333==', a, b, c);
}
function fn1() {
try{
var tt = new Promise((resolve, reject) => {
console.log('77777');
throw new Error('88888');
// reject('6666');
});
console.log('=====', tt);
} catch(e){
console.log('===error==', e);
}
}
var ttyy = fn1();
问题1: new Promise 里面的函数是同步执行的,为什么使用 try catch 不能捕获这个同步错误?
问题2: 这个错误使用上面的 window.onerror 和 window.onunhandledrejection 都不能捕获,那这种错误就没有办法进行全局捕获了吗?
写回答
2回答
-
双越
2022-04-02
你新建一个 html 文件,然后用 http-server 启动服务(像课程里一样)访问这个文件,即可看到效果。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>unhandledrejection</title> </head> <body> <p>unhandledrejection</p> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> window.addEventListener("unhandledrejection", event => { // 捕获 Promise 没有 catch 的错误 console.info('unhandledrejection----', event) }) new Promise((resolve, reject) => { throw new Error('xxxxx') }) </script> </body> </html>
00 -
双越
2022-04-01
第一,因为 new Promise(fn) 这个 fn 会被封装,执行 fn 时不会同步抛出错误,而是要异步触发 catch 回调
第二,不要在 Promise 外面用 try catch ,就可以用 window.onunhandledrejection 捕获错误了
012022-04-01
相似问题