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

  • 相关阅读:
    2018.9.22 Bubble Cup 11-Finals(Online Mirror,Div.2)
    2018.9.21 Codeforces Round #511(Div.2)
    2018.9.20 Educational Codeforces Round 51
    解题:USACO12OPEN Bookshelf
    解题:CF983B pyramid
    1214. 许可证密钥格式
    1212. 最大连续1的个数
    1270. 勒索信
    1250. 第三大的数
    1218. 补数
  • 原文地址:https://www.cnblogs.com/zhansu/p/11050641.html
Copyright © 2011-2022 走看看