由throw new Error() 引起的探讨

问题复现

在工做时遇到了须要抛出异常而且须要本身捕获处理的地方,因而在抛出的地方写下javascript

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

在捕获的地方写下:html

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

当时本身感受妥妥的,没毛病。
后来当其余地方出现了诡异的bug,定位问题时才发现这里的写法严重不对。java

问题分析

能够确定问题出在异常捕获而不是抛出。
这里是使用了throw来抛出异常,而且仍是使用segmentfault

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()时候穿进去的参数excel

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

问题解决

因为是异常捕获时候的错误因此咱们在捕获的时候这样处理htm

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

至此,问题解决。对象

反思

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

相关文章
相关标签/搜索