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

posted @ 2019-06-19 12:54  姜瑞涛  阅读(5274)  评论(1编辑  收藏  举报