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>


0
0

双越

2022-04-01

第一,因为 new Promise(fn) 这个 fn 会被封装,执行 fn 时不会同步抛出错误,而是要异步触发 catch 回调

第二,不要在 Promise 外面用 try catch ,就可以用  window.onunhandledrejection  捕获错误了

0
1
内六角
刚试了一下,就算不在 Promise 外面用 try catch , window.onunhandledrejection 也没有触发,老师可以试试看
2022-04-01
共1条回复

2周刷完100道前端优质面试真题 双越最新力作

『前端面试真题100道』视频详解

1509 学习 · 642 问题

查看课程