• 从研究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也是如此,多动手实践代码,不要完全详细网上的知识。

  • 相关阅读:
    《大话设计模式》ruby版代码:工厂方法模式
    《大话设计模式》ruby版代码:代理模式
    redis ruby客户端学习(一)
    《大话设计模式》ruby版代码:装饰模式
    打卡2
    打卡1
    分块题集
    2018 Multi-University Training Contest 7
    2018 Multi-University Training Contest 6
    2018 Multi-University Training Contest 4
  • 原文地址:https://www.cnblogs.com/zhansu/p/11050641.html
Copyright © 2020-2023  润新知