请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

promise 未捕获错误的两个问题

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 都不能捕获,那这种错误就没有办法进行全局捕获了吗?

正在回答 回答被采纳积分+3

2回答

双越 2022-04-02 09:23:48

你新建一个 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 回复 有任何疑惑可以回复我~
双越 2022-04-01 17:58:51

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 内六角 #1
    刚试了一下,就算不在 Promise 外面用 try catch ,  window.onunhandledrejection  也没有触发,老师可以试试看
    回复 有任何疑惑可以回复我~ 2022-04-01 19:36:44
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信