• 从研究try catch 捕获不到异步错误谈谈学习方法的问题


      做了刚新网站 姜瑞涛的官方网站

        先看下面的代码,思考一下输出

            try {
                throw new Error(3)
    
            } catch (e) {
                console.log(e)
            }
    
    
    
            try {
                setTimeout(function () {
                    throw new Error(5)
                }, 100)
    
            } catch (e) {
                console.log(e)
            }

      在浏览器是分别输出Error: 3(正常打印出错误实例,未报错)和 Uncaught Error: 5(一个未捕获错误)

    然后思考为何第二块代码未捕获到错误。自己目前的思考是try和catch是在当前调用栈里,遇到setTimeout的时候,把里面的回调函数放在了任务队列里了,try结束未发现异常也就不执行catch了,当调用栈执行结束,开始任务队列里的代码,这个时候抛出了错误,但已经没有接受此错误的地方了,因此报错。

    接下来,去社区找相关资料,找到这篇文章 驳《慎用 try catch》   文章写得不错,如下代码

    setTimeout(()=> {
      throw new Error('can you catch me!!!');
    })

    无论使用什么方式,都无法捕获异常。归根结底这是代码编写的问题,而非 try/catch 的问题。要捕获到异常,必须在throw new Error的直接外出用try catch包起来才行。下面思考Promise是如何捕获到异常的

        var promise = new Promise(function (resolve, reject) {
          throw new Error(5)
        })
        promise.then(v => console.log(v), e => console.log(e))

    上面的代码确实捕获到异常了,是如何捕获到的呢?在Promise的实现代码里,我们把回调函数包裹在try里了,所以捕获的到了。

    最后引出最近新的学习方法思考,尤其是被网上错误的二手资料误导的问题。学习编程,不仅仅要看文章,还要动手实践。CSS可以在自己电脑上实验布局和属性,以来可以确认资料是否有问题,二来加深印象。JS也是如此,多动手实践代码,不要完全详细网上的知识。

  • 相关阅读:
    泛型与非泛型
    C# 调用CMD,执行DOS命令
    数据库设计随笔(ZZ)
    关于三层开发(zz)
    三层架构学习(转)
    Node.js & child_process All In One
    HTML5 Canvas Tag Cloud All In One
    macOS & VSCode terminal show current git branch All In One
    飞书 excel 固定列 All In One
    git diff one of committed file All In One
  • 原文地址:https://www.cnblogs.com/zhansu/p/11050641.html
Copyright © 2020-2023  润新知