• throw new Error() 真实的用法和throw error 的却别


    1、 throw new Error();   这个是创建错误,创造一个错误类型抛出

    2、throw error   这个是抛出错误。

    问题复现

    在工作时遇到了需要抛出异常并且需要自己捕获处理的地方,于是在抛出的地方写下

    function parseExcel(con) {
       try {
            // doSomething
        } catch (error) {
            throw new Error('parse excel failed');
        }
    }

    在捕获的地方写下:

    try {
        parseExcel(con);
    } catch (error) {
        if (error === 'parse excel failed') {
            //doSomething
        }
    }

    当时自己感觉妥妥的,没毛病。
    后来当其他地方出现了诡异的bug,定位问题时才发现这里的写法严重不对。

    问题分析

    可以肯定问题出在异常捕获而不是抛出。
    这里是使用了throw来抛出异常,并且还是使用

    throw new Error('error message');

    这样的实例化写法,这样的写法是很规范的,是js规范所推崇的。但是这里需要注意的是,throw出去的是一个Error对象,而类似下面的这种字符串

    throw 'error message'; // 不建议的写法

    所以捕获的时候捕获到的也是一个对象,这样一个对象与parse excel failed字符串比较显然是不正确的。
    那么该怎么去捕获这个error message呢?
    通过对《JavaScript高级程序设计 (第三版) 》对于抛出错误的学习我们可以了解到:

    在抛出的Error对象中有一个被广泛支持的属性:namemessage
    name:用来存储错误的类型,在ECMA-262定义了七种错误类型:ErrorEvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError。详情见:try-catch语句
    message:用来存储error message,就是你new Error()时候穿进去的参数

    到此,上面的问题应迎刃而解。

    问题解决

    由于是异常捕获时候的错误所以我们在捕获的时候这样处理

    try {
        parseExcel(con);
    } catch (error) {
        if (error。message === 'parse excel failed') {
            //doSomething
        }
    }

    至此,问题解决。

    反思

    我在这之前是从未试用过throw的,在用的时候也是从不深究,马马虎虎拿来就用,如果不是因为后来出了问题去解决,估计不会发现原来js的错误处理还有很多道道。写程序是一件很严谨的事情,一丝一毫也马虎不得,更不可想当然。

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    java面向接口编程之适配器模式
    java面向接口编程之制定标准和简单工厂模式
    java接口的使用
    java接口(interface)
    java抽象类的体现-模板模式
    java 抽象类
    java final 关键字
    Singleton模式(单例模式) 饿汉式和懒汉式
    java构造方法的私有化
    java代码块
  • 原文地址:https://www.cnblogs.com/jijm123/p/13930951.html
Copyright © 2020-2023  润新知