资讯专栏INFORMATION COLUMN

由throw new Error() 引发的探讨

chengjianhua / 2172人阅读

摘要:后来当其他地方出现了诡异的,定位问题时才发现这里的写法严重不对。问题分析可以肯定问题出在异常捕获而不是抛出。问题解决由于是异常捕获时候的错误所以我们在捕获的时候这样处理。至此,问题解决。

问题复现

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

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的错误处理还有很多道道。写程序是一件很严谨的事情,一丝一毫也马虎不得,更不可想当然。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84798.html

相关文章

  • 一道面试题引发思考:(2)

    摘要:由虚拟机生成并抛出,,属于系统内部错误或者资源耗尽等严重情况,属于需要担负的责任,这一类异常事件是无法恢复或者不可能捕获的,将导致应用程序中断,但是自定义是可以捕获的。 题目 showImg(http://img-storage.qiniudn.com/15-9-22/50608386.jpg); 答案:D 分析 Java 异常的结构体系 showImg(http://img-stor...

    stefan 评论0 收藏0
  • JavaScript引擎是如何工作?从调用栈到Promise你需要知道一切

    摘要:最受欢迎的引擎是,在和中使用,用于,以及所使用的。怎么处理每个引擎都有一个基本组件,称为调用栈。也就是说,如果有其他函数等待执行,函数是不能离开调用栈的。每个异步函数在被送入调用栈之前必须通过回调队列。例如方法是在中传递的回调函数。   翻译:疯狂的技术宅 原文:www.valentinog.com/blog/engine… 从Call Stack,Global Me...

    zzbo 评论0 收藏0
  • JavaScript引擎是如何工作?从调用栈到Promise你需要知道一切

    摘要:最受欢迎的引擎是,在和中使用,用于,以及所使用的。单线程的我们说是单线程的,因为有一个调用栈处理我们的函数。也就是说,如果有其他函数等待执行,函数是不能离开调用栈的。每个异步函数在被送入调用栈之前必须通过回调队列。 翻译:疯狂的技术宅原文:https://www.valentinog.com/bl... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 sh...

    Simon_Zhou 评论0 收藏0
  • JavaScript 编程精解 中文第三版 八、Bug 和错误

    摘要:幸运的是,使用符号创建的构造器,如果在不使用来调用,则始终会报错,即使在非严格模式下也不会产生问题。 来源:ApacheCN『JavaScript 编程精解 中文第三版』翻译项目原文:Bugs and Errors 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 调试的难度是开始编写代码的两倍。 因此,如...

    wujl596 评论0 收藏0
  • JavaScript之错误异常探讨

    摘要:提供一套错误处理机制,错误是干扰程序正常流程的非正常的事故。构造函数是通用错误类型,除了类型,还有等类型。浏览器输出其他错误类型构造函数是继承,实例是一致的。数值超出有效范围数值超出有效范围创建一个实例,表示错误的原因无效引用。 同步发布于 https://github.com/xianshanna... 我的建议是不要隐藏错误,勇敢地抛出来。没有人会因为代码出现 bug 导致程序崩溃...

    LdhAndroid 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<